当找到 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 种情况下使用的正确响应代码,但如果您试图通过区分原因来简化开发时间,请使用不同的原因短语。

例如

  1. 不正确的路线return默认404 Not Found
  2. 路线正确,但未找到具有该 ID 的资源404 Customer Not Found
  3. 路线正确,但未找到符合搜索条件的资源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
}