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

con*_*nny 36 rest web-services http-status-codes

难道要考虑好的做法,以重新使用RFC HTTP状态代码这个样子,或者我们应该组成新的恰好映射到我们具体的错误原因是什么?

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

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

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

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

如果"next_checkpoint" 1234有效请求,GET/package/1234/next_checkpoint返回400 Bad Request,但next_checkpont在这里没有意义......

等等......但是,在某些情况下,事情需要比"400"更具体 - 例如:

POST/dispatch /?for_package = 1234返回412 Precondition如果/ dispatch和package 1234都存在则失败,但是1234尚未准备好进行调度.


(编辑:状态代码在HTTP/1.1.在WebDAV的电话分机的状态码)

Jan*_*sen 25

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

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

一月

  • @Conny:请记住,WebDAV不是***特定的应用程序.它是HTTP统一接口的扩展.重用其中一些扩展(例如422)很有意义,但有些只是破坏REST的约束(全部或PROP*)或HTTP本身(COPY,MOVE).那些我不会重用的. (3认同)

Dar*_*ler 17

对于这样的场景,422 Unprocessable Entity是一个有用的错误代码.当域规则 对附加信息无效时,请参阅此问题什么是对于put方法的休息服务的http响应代码.


Mik*_*ike 5

如果"next_checkpoint"和1234有效请求,则GET/package/1234/next_checkpoint返回400 Bad Request,但next_checkpont在这里没有意义......

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

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