返回 HttpResponseMessage 的 Web API 最佳方法
Posted
技术标签:
【中文标题】返回 HttpResponseMessage 的 Web API 最佳方法【英文标题】:Web API Best Approach for returning HttpResponseMessage 【发布时间】:2014-05-25 19:31:39 【问题描述】:我有一个 Web API 项目,并且我的方法总是返回 HttpResponseMessage。
所以,如果成功或失败,我会返回:
没有错误:
return Request.CreateResponse(HttpStatusCode.OK,"File was processed.");
任何错误或失败
return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process.");
当我返回一个对象时,我会使用:
return Request.CreateResponse(HttpStatusCode.OK, user);
我想知道如何将更好的封装响应返回给我的 html5 客户端,以便返回有关交易等的更多信息。
我正在考虑创建一个自定义类,它可以封装 HttpResponseMessage 但也有更多数据。
有没有人实现过类似的东西?
【问题讨论】:
您不应在 HttpStatusCode.NoContent 中使用任何内容。 一般来说,如果你返回一个带有HttpStatusCode.NoContent
的HttpActionResult,它会 - 令人惊讶 - 不返回任何内容,即使你在上面的例子中传递了一个字符串。可能是一个令人惊讶的错误。就像下面用户 BigTone 的回答一样。根据规范httpstatuses.com/204A 204 response is terminated by the first empty line after the header fields because it cannot contain a message body.
,这也是有道理的
【参考方案1】:
虽然这不是直接回答问题,但我想提供一些我认为有用的信息。 http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx
HttpResponseMessage 已或多或少地被 IHttpActionResult 取代。它更清洁,更易于使用。
public IHttpActionResult Get()
Object obj = new Object();
if (obj == null)
return NotFound();
return Ok(obj);
然后您可以封装以创建自定义的。 How to set custom headers when using IHttpActionResult?
我还没有发现实现自定义结果的需要,但是当我这样做时,我会走这条路。
这可能与使用旧版本非常相似。
进一步扩展并提供更多信息。您还可以在某些请求中包含消息。例如。
return BadRequest("Custom Message Here");
您无法对许多其他消息执行此操作,但有助于处理您想要发回的常见消息。
【讨论】:
感谢你,我再也不会使用可怕的 HttpResponseMessage 如果您使用的是 MVC Core 或今天所称的任何东西,您正在寻找的类型可能称为IActionResult
【参考方案2】:
您可以返回错误响应以提供更多详细信息。
public HttpResponseMessage Get()
HttpError myCustomError = new HttpError("The file has no content or rows to process.") "CustomErrorCode", 42 ;
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError);
会返回:
"Message": "The file has no content or rows to process.",
"CustomErrorCode": 42
更多详情:http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx
我还使用http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 来帮助我确定要返回的http 状态代码。
【讨论】:
【参考方案3】:一个重要提示:不要将内容放入 204 响应中!它不仅违反 HTTP 规范,而且如果您这样做,.NET 实际上可能会以意想不到的方式运行。
我误用了return Request.CreateResponse(HttpStatusCode.NoContent, null);
,真是让人头疼;来自同一会话的未来请求将由于在响应前附加 "null"
字符串值而中断。我猜 .NET 并不总是完全清除来自同一会话的 API 调用的响应对象。
【讨论】:
一般来说,如果你返回一个带有HttpStatusCode.NoContent
的HttpActionResult,它会 - 令人惊讶的是 - 不返回任何内容,即使你像上面的 OP 一样传递内容。可能是一个令人惊讶的错误。以上是关于返回 HttpResponseMessage 的 Web API 最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
HttpResponseMessage.Content.ReasAsString 返回一个空字符串
WEB API HttpResponseMessage 返回 JSONP
在 .NET 核心中返回 HttpResponseMessage 时出错
WCF Restful返回HttpResponseMessage想要在设置内容时进行协商