当找到 route/url 但找不到其背后的资源时 return 怎么办?
What to return when a route/url is found but not the resource behind it?
当路由customer/1存在但客户搜索后面的resource/entity不存在时,
我应该 return 404 吗?我的意思是路线存在...
或者我应该return一个
204 (No content) 因为找不到客户结果为空
微软示例:
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 在这里不正确?!
CLARIFICATION/IMPROVEMENT 我的问题。
我需要区分一个
1) 路线:customer/1 => 路线不存在
(我会 return 这里 404,但这无论如何都由框架处理...)
2) 路由:customer/1 => 存在但数据库中的 resource/entity NOT
(我会 return 这里是 404)
3) 路由:customersSearch/searchterm => 数据库中的 resource/entity 未找到
(我会return一个204)
请您客气一点,请更正您对这个更明确问题的回答好吗?
这是一个设计问题,但我同意你的看法,404 可能不是这里合适的状态代码,因为 4xx 表示客户端错误。我会从 2xx(204 在这里确实是一个不错的选择)或 5xx 中挑选一些东西。供您参考,这里是 http 状态代码的 RFC:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
根据您的更新,204 是可接受的 return 代码。
一般 REST 准则规定,在这种情况下,您应该 return 404。您请求的特定资源不存在。就好像您从网站上请求了一份物理文件。
在我所有的工作场所,都是企业架构团队发布的模式:)
不过提个建议...针对这种情况进行某种形式的日志记录,以便您可以检测到 "logical" 404(在这种情况下)与真正的无资源/处理程序/脚本映射可用服务请求!至少在部署时识别问题 :)
我倾向于使用自定义 HTTP 原因短语来区分 404 是由于未找到资源而不是格式错误的 URL 导致不正确的路由。 404 仍然是在所有 3 种情况下使用的正确响应代码,但如果您试图通过区分原因来简化开发时间,请使用不同的原因短语。
例如
- 不正确的路线return默认
404 Not Found
- 路线正确,但未找到具有该 ID 的资源
404 Customer Not Found
- 路线正确,但未找到符合搜索条件的资源
404 No Customers Found
我将 204 解释为与上述评论不同,因为 204 spec 声明(强调我的):
The server has fulfilled the request but does not need to return an entity-body
在这种情况下,api 确实需要 return 一个实体主体,它根本无法做到,因为请求的信息不可用。因此它是未找到
如何在 Web 中 return 自定义原因短语的示例 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
}
当路由customer/1存在但客户搜索后面的resource/entity不存在时,
我应该 return 404 吗?我的意思是路线存在...
或者我应该return一个
204 (No content) 因为找不到客户结果为空
微软示例:
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 在这里不正确?!
CLARIFICATION/IMPROVEMENT 我的问题。
我需要区分一个
1) 路线:customer/1 => 路线不存在
(我会 return 这里 404,但这无论如何都由框架处理...)
2) 路由:customer/1 => 存在但数据库中的 resource/entity NOT
(我会 return 这里是 404)
3) 路由:customersSearch/searchterm => 数据库中的 resource/entity 未找到
(我会return一个204)
请您客气一点,请更正您对这个更明确问题的回答好吗?
这是一个设计问题,但我同意你的看法,404 可能不是这里合适的状态代码,因为 4xx 表示客户端错误。我会从 2xx(204 在这里确实是一个不错的选择)或 5xx 中挑选一些东西。供您参考,这里是 http 状态代码的 RFC: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
根据您的更新,204 是可接受的 return 代码。
一般 REST 准则规定,在这种情况下,您应该 return 404。您请求的特定资源不存在。就好像您从网站上请求了一份物理文件。
在我所有的工作场所,都是企业架构团队发布的模式:)
不过提个建议...针对这种情况进行某种形式的日志记录,以便您可以检测到 "logical" 404(在这种情况下)与真正的无资源/处理程序/脚本映射可用服务请求!至少在部署时识别问题 :)
我倾向于使用自定义 HTTP 原因短语来区分 404 是由于未找到资源而不是格式错误的 URL 导致不正确的路由。 404 仍然是在所有 3 种情况下使用的正确响应代码,但如果您试图通过区分原因来简化开发时间,请使用不同的原因短语。
例如
- 不正确的路线return默认
404 Not Found
- 路线正确,但未找到具有该 ID 的资源
404 Customer Not Found
- 路线正确,但未找到符合搜索条件的资源
404 No Customers Found
我将 204 解释为与上述评论不同,因为 204 spec 声明(强调我的):
The server has fulfilled the request but does not need to return an entity-body
在这种情况下,api 确实需要 return 一个实体主体,它根本无法做到,因为请求的信息不可用。因此它是未找到
如何在 Web 中 return 自定义原因短语的示例 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
}