找到路由/网址时返回的内容但不包含其背后的资源?

时间:2015-08-05 18:41:21

标签: c# asp.net-web-api asp.net-web-api2

当路径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)

请你这样做并纠正你对这个更明确的问题的答案吗?

3 个答案:

答案 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。

  1. 错误的路由返回默认404 Not Found
  2. 正确路由,但找不到具有该ID的资源404 Customer Not Found
  3. 找到正确的路线,但找不到符合搜索条件404 No Customers Found
  4. 的资源

    我认为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
    }