我有一个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; }
}
然后你就有了一个更容易阅读的标准响应,如果需要,你可以随时添加更多信息。