Web API返回HttpResponseMessage的最佳方法



我有一个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,但也有更多的数据。

有人实现过类似的东西吗?

虽然这不是直接回答问题,但我想提供一些我觉得有用的信息。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");

您无法对许多其他邮件执行此操作,但这有助于您发送回的常见邮件。

您可以返回错误响应以提供更多详细信息。

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

一个重要的注意事项:不要在204个响应中放入内容!这不仅违反了HTTP规范,而且如果你这样做,.NET实际上可能会以意想不到的方式运行。

我错误地使用了return Request.CreateResponse(HttpStatusCode.NoContent, null);,这导致了我真正的头痛;来自同一会话的未来请求将由于在响应前添加了"null"字符串值而中断。我猜.NET并不总是完全清除来自同一会话的API调用的响应对象。

我正在学习,所以不要说我要说的话可能很傻(或不傻)。

为什么不为您的APIResponse创建一个类/模型?类似于:

 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; }
    }

然后你就有了一个更容易阅读的标准响应,如果需要,你可以随时添加更多信息。

相关内容

  • 没有找到相关文章

最新更新