8

首先,我阅读了一些相关的帖子:

但我仍然认为我应该在这里提出我的问题和想法。REST API 中用于使用 GET 查询“尚未准备好,稍后再试”资源的 HTTP 状态代码应该是什么?例如,客户端尝试通过对以下 url 进行 HTTP GET 来查询未来发生的所有本地新闻(!):http ://example.com/news?city=chicago&date=2099-12-31那么服务器应该回复什么?

这些是我考虑的 http 状态代码、它们的 rfc 定义以及我不完全满意的原因:

  • 3xx 重定向。评论:不是一个选项,因为没有其他链接可以重定向到。

  • 503 Service Unavailable:由于服务器临时过载或维护,服务器当前无法处理请求。这意味着这是一种暂时的情况,经过一段时间的延迟会得到缓解。如果已知,延迟的长度可以在 Retry-After 标头中指示。评论:重试行为是需要的,但从语义上讲,这种情况根本不是服务器的错,所以所有 5xx 看起来都很奇怪。

  • 4xx 客户端错误。评论:看起来很有希望。见下文。

  • 413 Request Entity Too Large:服务器拒绝处理请求,因为请求实体大于服务器愿意或能够处理的。...如果条件是临时的,服务器应该包含一个 Retry-After 头域来指示它是临时的,并且在什么时间之后客户端可以重试。评论:需要重试行为,但是“实体太大”部分有些误导。

  • 417 期望失败:此服务器无法满足在期望请求标头字段(请参阅第 14.20 节)中给出的期望。评论:所以它应该是由 Expect 请求标头引起的,不适用于我的情况。

  • 406 Not Acceptable: 根据请求中发送的接受标头,资源...不可接受。评论:所以它是由 Accept 请求标头引起的,不适用于我的情况。

  • 409 Conflict:由于与资源的当前状态冲突,请求无法完成。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。...响应 PUT 请求时最有可能发生冲突。评论:这个很接近。尽管我的案例与 PUT 无关,实际上也不是由冲突引起的。

  • 404 Not Found:服务器没有找到任何匹配 Request-URI 的东西。评论:从技术上讲,我的 url 路径(http://example.com/news)确实存在,它是导致问题的参数。在这种情况下,返回一个空集合而不是 404 可能更合适。

  • 403 Forbidden:服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。评论:通常这应该用于任何受限资源?

  • 400 Bad Request:由于语法错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。评论:在我的情况下这不是真的。我的服务器理解这个请求,它的语法很好,只是意思不好。

  • 2xx 成功。评论:如果 4xx 不起作用,那么 2xx 怎么样?见下文。

  • 200 好的。评论:很好。那么我应该在响应正文中包含什么?null or [] or {} or {"date": "2099-12-31", "content_list": null} or ...哪个更直观?另一方面,我更喜欢一种方法来清楚地区分小的“未来新闻”错误和更常见的“所有查询条件都很好,只是今天没有新闻”的情况。

  • 202 Accepted:请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行。评论:如果我们可以在 GET 请求中使用 202,则可以接受。然后参考200评论。

  • 204 No Content:服务器已完成请求,但不需要返回实体主体。评论:如果我们可以在 GET 请求中使用 204,这是可以接受的。就是不知道这个比202好还是200好。

  • 有关 2xx 的更多信息:评论:我认为所有 2xx 响应都可能会缓存在某处。但就我而言,如果我为“明天的新闻”返回一个空正文,我不希望它被缓存。好的,明确指定“无缓存”标头应该会有所帮助。

你的意见?

4

2 回答 2

4

使用 404。

您对它的反对是基于对 URI 的普遍理解,即不包括查询字符串。“因为我有多个映射到同一个处理程序的 URI,”逻辑说,“我的资源确实存在,只是被查询字符串 args 参数化。”

这是不正确的。正如URI 规范本身在第 3.3 节(强调我的)中所说,

“路径组件包含通常以分层形式组织的数据,这些数据与非分层查询组件(第 3.4 节)中的数据一起用于标识 URI 方案和命名权限(如果有)范围内的资源。 "

资源由 URI 标识,对绝对 URI 任何部分的任何更改都标识一个单独的资源。每天向您认识的每个人发推文,直到他们告诉您停止。因此404是一个完美的匹配:“404(未找到)状态代码表明源服务器没有找到目标资源的当前表示或不愿意透露存在的表示。”

于 2013-10-17T14:34:54.687 回答
2

您正在检索当天的新闻,这是一个有效的日子,只是没有任何新闻。一个空体的 200 响应,或者基于媒体类型的任何有意义的响应似乎是合乎逻辑的。这取决于您与客户确定的媒体类型。

如果日期格式错误,404 会更有意义(您要求 11 月 45 日,或者要求一个不存在的城市。)

顺便说一句,网址最好采用http://example.com/news/chicago/2099-12-31格式,因为这是您要检索的特定资源。这种格式也会使 404 之类的内容更加清晰。

于 2013-10-17T09:24:34.073 回答