返回HttpResponseMessage的Web API最佳方法

33

我有一个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中,您不应使用任何内容。 - kappadoky
通常情况下,如果您使用 HttpStatusCode.NoContent 返回 HttpActionResult,则会 - 惊讶地 - 不返回任何内容,即使您像上面的示例一样传递了一个字符串。这可能是一个令人惊讶的错误。就像用户BigTone在下面的答案中所说的那样。 根据规范 https://httpstatuses.com/204,这也是有道理的。`204响应由头字段后的第一行空行终止,因为它不能包含消息正文。` - Don Cheadle
4个回答

37

虽然这并没有直接回答问题,但我想提供一些我发现有用的信息。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);
 }

然后您可以封装以创建自定义的封装器。 如何在使用IHttpActionResult时设置自定义标头?

我还没有发现需要实现自定义结果的需求,但当我需要时,我会采用这种方法。

使用旧版也可能非常类似。

为了进一步扩展并提供更多信息,您还可以在某些请求中包括消息。例如。

return BadRequest("Custom Message Here");

你不能用许多其他方法来实现这一点,但对于你想发送回的常见消息有所帮助。


2
由于您的帮助,我再也不会使用可怕的HttpResponseMessage了。 - I Stand With Russia
如果你正在使用MVC Core或者它今天被称为什么,你要找的类型可能叫做IActionResult - Adam Baxter

8
您可以返回错误响应来提供更多细节。
public HttpResponseMessage Get()
{
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } };
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError);
 }

Would return:

{ 
  "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状态码。


4
重要提示:不要在204响应中添加内容!这不仅违反了HTTP规范,而且如果您这样做的话,.NET实际上可能会表现出意外的行为。
我曾经错误地使用了return Request.CreateResponse(HttpStatusCode.NoContent, null);,结果导致了一个真正的头疼问题;由于响应中有一个"null"字符串值,所以来自同一会话的未来请求将会出错。我想.NET并不总是会完全清除API调用响应对象中的内容。

通常情况下,如果你使用 HttpStatusCode.NoContent 返回一个 HttpActionResult,它将不会返回任何内容,即使你像上面 OP 的情况一样传递了内容。这可能是一个令人惊讶的错误。 - Don Cheadle

0

我正在学习,所以我即将说的话可能很蠢(或者不是)。

为什么不为你的 API 响应创建一个类/模型呢?像这样:

 public class APIResponse
    {
        public HttpStatusCode StatusCode { get; set; }
        public bool IsSuccess { get; set; } = true;
        public List<string> Messages { get; set; }
        public object Object { get; set; }
    }

那么你就有一个更易于阅读的标准响应,如果需要,你总是可以添加更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接