REST API中的HTTP状态代码,用于使用GET查询“尚未准备好,稍后再试”资源?

时间:2013-10-17 08:21:34

标签: rest http-get

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

但我仍然认为我应该在这里提出我的问题和想法。 REST API中的HTTP状态代码应该是什么?使用GET到QUERY“未准备好,稍后再试”资源?例如,客户端尝试通过对此URL进行HTTP GET来查询将来发生的所有本地新闻(!),那么服务器应该回复什么?

这些是我考虑过的http状态代码,它们的rfc定义以及我对此不满意的原因:

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

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

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

  • 413请求实体太大:服务器拒绝处理请求,因为请求实体大于服务器愿意或能够处理的请求实体。 ...如果条件是临时的,服务器应该包括一个Retry-After头字段,以指示它是临时的,以及客户端可以再次尝试的时间。 评论:需要重试行为,但“实体太大”部分有些误导。

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

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

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

  • 404 Not Found:服务器未找到与Request-URI匹配的任何内容。 评论:从技术上讲,我的网址路径(http://example.com/news?city=chicago&date=2099-12-31)确实存在,这是导致问题的参数。在这种情况下,返回空集合而不是404,可能更合适。

  • 403 Forbidden:服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。 评论:通常这应该在任何受限制的资源中使用?

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

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

  • 200 OK。 评论:很好。那么我应该在响应体中包含什么呢? null或[]或{}或{“date”:“2099-12-31”,“content_list”:null}或者......哪一个更直观?另一方面,我更喜欢一种方法,可以将较小的“未来新闻”错误与更常​​见的“所有查询标准都很好,今天没有新闻”的情况明确区分开来。

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

  • 204 No Content:服务器已完成请求但不需要返回实体。 评论:假设我们可以在GET请求中使用204,则可以接受。只是不知道这是否优于202或200。

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

你的想法?

2 个答案:

答案 0 :(得分:4)

使用404。

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

这是不正确的。正如the URI spec本身在第3.3节(强调我的)中所述,

  

“路径组件包含数据,通常以分层结构组织   表单,即以及非分层查询中的数据   组件(第3.4节),用于标识内部的资源   URI的方案范围和命名权限(如果有的话)。“

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

答案 1 :(得分:1)

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

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

除此之外,URL格式http://example.com/news/chicago/2099-12-31会更好,因为这是您要检索的特定资源。这种格式可以使像404这样的东西更清晰。