当路径customer / 1存在但客户搜索后面的资源/实体不存在时,
我应该退回404吗?我的意思是路线存在......
或者我应该返回
204(无内容),因为我找不到客户,结果是空的。
Microsoft示例:
public IHttpActionResult Get (int id)
{
Product product = _repository.Get (id);
if (product == null)
{
return NotFound(); // Returns a NotFoundResult
}
return Ok(product); // Returns an OkNegotiatedContentResult
}
在我看来,NotFound()=> 404这里不正确?!
我的问题澄清/改进。
我需要区分一个
1)route:customer / 1 =>路线不存在
(我会在这里返回404,但无论如何这都是由框架处理的......)
2)route:customer / 1 =>存在,但数据库中的资源/实体不是
(我会在这里返回404)
3)route:customersSearch / searchterm =>找不到数据库中的资源/实体
(我会返回204)
请你这样做并纠正你对这个更明确的问题的答案吗?
答案 0 :(得分:3)
一般REST指南规定,在这种情况下,您应该返回404.您已经要求提供不存在的特定资源。好像您已经从网站请求了一个物理文档。
在我的所有工作场所一直是模式并由企业架构团队发布:)
虽然有一个建议......对于这种情况有某种形式的日志记录,因此您可以检测到“逻辑”404(在此方案中)与真正的无资源/处理程序/脚本映射可用于服务请求!至少在部署时识别问题:)
答案 1 :(得分:1)
这是一个设计问题,但我同意你的看法,404可能不是适当的状态代码,因为4xx意味着客户端错误。我会选择2xx(204确实是一个不错的选择)或5xx。供您参考,这里是http状态代码的RFC: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
根据您的更新,204是可接受的返回代码。
答案 2 :(得分:1)
我倾向于使用自定义HTTP Reason Phrase来区分404是由于找不到资源而不是格式错误的URL导致路由错误。 404仍然是在所有3种情况下使用的正确响应代码,但如果您试图通过区分原因来简化开发时间,则使用不同的原因短语。
e.g。
404 Not Found
404 Customer Not Found
404 No Customers Found
我认为204与上述评论的不同之处在于204 spec州(强调我的):
服务器已完成请求但不需要返回实体正文
在这种情况下,api确实需要返回一个实体 - 身体,它根本无法通知,因为所请求的信息不可用。因此它是 Not Found
如何在Web API中返回自定义原因短语的示例。
public IHttpActionResult Get (int id)
{
Product product = _repository.Get (id);
if (product == null)
{
var response = Request.CreateErrorResponse(HttpStatusCode.NotFound, "");
response.ReasonPhrase = "Product Not Found";
return response;
}
return Ok(product); // Returns an OkNegotiatedContentResult
}