REST:将应用程序错误映射到HTTP状态代码

时间:2010-03-04 15:43:44

标签: web-services rest http-status-codes

良好做法视为重复使用RFC HTTP状态代码,或者我们应该制作新的地图出于我们特定的错误原因?

我们正在围绕几个遗留应用程序设计一个Web服务API。

除了响应正文中的JSON / XML数据结构外,我们还希望返回对Web缓存开发人员有意义的HTTP状态代码。

但是,如何将不同类别的错误映射到适当的HTTP状态代码?团队中的每个人都同意以下内容:

  

GET / package / 1234 如果1234不存在则返回 404 Not Found

     

GET / package / 1234 / next_checkpoint 返回 400错误请求,如果“next_checkpoint” 1234有效请求但next_checkpont此处没有没有意义......

依旧......但是,在某些情况下,事情需要比“400”更具体 - 例如:

  

POST / dispatch /?for_package = 1234 如果/ dispatch和包1234都存在则返回 412前提条件失败,但尚未准备好发送。< / p>


修改:Status codes in HTTP/1.1Status codes in WebDAV ext.

5 个答案:

答案 0 :(得分:25)

REST的HTTP使用意味着您必须保持API的统一。这意味着您无法添加特定于域的方法(ala GET_STOCK_QUOTE),但这也意味着您无法添加特定于域的错误代码(ala 499产品缺货)。

实际上,HTTP客户端错误代码是一个很好的设计检查,因为如果正确设计资源语义,HTTP错误代码含义将正确表达任何错误。如果您认为需要其他错误代码,则可能是您的资源设计错误。

答案 1 :(得分:17)

422 Unprocessable Entity对于这样的场景是一个有用的错误代码。有关其他信息,请参阅此问题what http response code for rest service on put method when domain rules invalid

答案 2 :(得分:5)

  

GET / package / 1234 / next_checkpoint   如果返回400错误请求   “next_checkpoint”和1234有效   在这里要求但是next_checkpont   没有意义......

这是考虑该URI的错误方法。

URI是不透明的,因此从客户的角度来看,观察它的某些部分是“有效的”而其他部分不是没有任何意义。因此,您应该“只”将404返回给客户端,因为资源“package / 1234 / next_checkpoint”不存在。

答案 3 :(得分:4)

当客户端出错时,您应该使用最符合您请求的4xx系列响应,但请注意不要使用针对特定标头或条件的响应。我倾向于返回一个人类可读的状态消息,并将错误的纯文本版本作为响应正文或结构化错误消息,具体取决于应用程序上下文。

更新:在进一步阅读RFC时,“procondition failed”意味着条件标头,例如“if-none-match”。我会给出一般的400消息。

答案 4 :(得分:0)

实际上,你根本不应该这样做。您对404 Not Found的使用是正确的,但400 Bad Request使用不当。根据RFC的400 Bad Request仅在HTTP协议格式错误时使用。在您的情况下,请求在语法上是正确的,它只是一个意外的参数。您应该返回500 Server Error,然后在REST结果中包含错误代码。