为不可满足的REST请求更正HTTP状态代码

时间:2012-01-21 18:28:48

标签: rest http-status-codes

我目前正在使用RESTful API开发一个任务队列。

为了处理任务,工人必须创建租约。

PUT .../leases

如果任务队列中有任务可用,则会成功,将创建租约,服务器将以状态201响应。

我不确定在没有任何任务时如何处理这种情况。当没有可用任务时,无法创建租约。哪种HTTP状态代码适用于这种情况?

  • 204 No Content - 客户端没有出错,但没有数据。

  • 400 Bad Request - 这是不适用的,因为它意味着“服务器无法理解请求”,情况并非如此

与此同时,我认为这种做法可能并不理想。要么我使用503,按照Brian的推荐,也要使用REST in practice的段落,或者我改变整个过程。

我在考虑可以暂时创建的租约。这意味着

  1. PUT/leases
  2. 创建租约,分配任务并使用201回复或创建暂定租约并使用202回复
  3. 暂定租约会停留一段时间。如果任务可用,则将其分配给暂定租约。如果特定时间段内没有任务,则租约将被删除,服务器将以410
  4. 回复
  5. 然后客户应该以1开始。

4 个答案:

答案 0 :(得分:3)

由于资源是由服务器控制的,客户端无法做任何事情来影响结果,因此500范围的代码是最合适的。

503 - Service Unavailable听起来对我不对。这意味着服务器没有足够的资源来满足请求的需要。您可能还应该在响应正文中返回一个有意义的错误,以明确说明它失败了,因为没有可用的租约/任务,但在将来某个时候可能不是这种情况。

答案 1 :(得分:1)

可以使用

404 - Not FoundWikipedia将其概括为:

  

找不到请求的资源,但将来可能会再次提供。客户的后续请求是允许的。

答案 2 :(得分:1)

404几乎可以工作,但我认为它是你正在处理的资源,你正在做一个创建资源的PUT。当然,它不存在,这就是你创造它的原因。

我同意你在狭义的定义中对400 Bad Request的第一个想法。但是,如果你扩大定义以包括任何可能出错的请求,那么它将适合你的情况,我认为这样做是可以接受的。例如,如果请求不符合我们期望的模式并且资源上存在验证错误,我们会发回400。对于我们的服务,如果我们可以通过编程确定这是一个错误的请求,我们会发回400。

对于您的服务,在没有可用任务的情况下创建租约会构成错误请求,您可以向400发送说明问题的文本。我认为400意味着更广泛的定义,然后你持有它。

我不认为500的工作是因为它们是更难处理的东西,这是一个你可以处理并提供信息响应的案例。

希望这有帮助。

答案 3 :(得分:0)

如果我尝试使用不受支持的方法(即PUT需要GET时),IIS会发送405方法不允许。如果端点根本不存在,它会发送404 Not Found。