REST API错误返回好的做法
我正在寻找有关从REST API返回错误的良好实践的指导。 我正在研究一个新的API,所以我现在可以把它放在任何方向。 我的内容types目前是XML,但是我打算将来支持JSON。
我现在正在添加一些错误情况,例如客户端尝试添加新的资源,但超过了他的存储配额。 我已经处理了HTTP状态代码的某些错误情况(401用于身份validation,403用于授权,404用于普通的错误请求URI)。 我查看了这个幸运的HTTP错误代码,但400-417范围没有一个报告应用程序特定的错误。 所以起初我很想用200 OK和一个特定的XML有效载荷来回报我的应用程序错误(即支付我们更多,你将得到你需要的存储!),但我停下来想想,它似乎肥皂(/恐惧地耸耸肩)。 另外感觉就像我将错误响应分解成不同的情况,例如一些是由http状态码驱动,另一些是内容驱动的。
那么行业build议是什么? 好的做法(请解释一下为什么!)以及从客户端pov,REST API中的error handling是如何使客户端代码变得更容易?
所以起初我很想用200 OK和一个特定的XML有效载荷来回报我的应用程序错误(即支付我们更多,你将得到你需要的存储!),但我停下来想想,它似乎肥皂(/恐惧地耸耸肩)。
除非请求没有错,否则我不会返回200。 从RFC2616开始 ,200表示“请求成功”。
如果客户的存储配额已经超出了(无论什么原因),我会返回403(禁止):
服务器了解请求,但拒绝履行。 授权不起作用,请求不应重复。 如果请求方法不是HEAD,服务器希望公开为什么请求没有被满足,那么它应该描述拒绝的原因。 如果服务器不希望将这些信息提供给客户端,则可以使用状态码404(Not Found)。
这告诉客户端,请求是好的,但它失败了(200不做的东西)。 这也让你有机会在响应主体中解释问题(及其解决scheme)。
你有什么其他具体的错误条件?
一个很好的资源,为您的APIselect正确的HTTP错误代码: http : //racksburg.com/choosing-an-http-status-code/
文章摘录:
从哪儿开始:
2XX / 3XX:
4XX:
5XX:
主要select是否要将HTTP状态码视为REST API的一部分。
这两种方式工作正常。 我同意,严格来说,REST的一个概念是,您应该使用HTTP状态代码作为您的API的一部分(取决于各种错误情况返回200或201成功的操作和4xx或5xx)。 ,没有REST警察。 你可以做你想做的。 我已经看到更多令人震惊的非REST API被称为“RESTful”。
此时 (2015年8月),我build议您使用HTTP状态代码作为API的一部分。 使用框架比现在更容易看到返回代码。 特别是,现在比以前更容易看到非200回复的案件和非200回复的案件。
HTTP状态代码是你的api的一部分
-
您需要仔细select符合您的错误条件的4xx代码。 您可以包含一个rest,xml或明文消息作为包含子代码和描述性注释的有效内容。
-
客户端将需要使用一个软件框架,使他们能够获得HTTP级别的状态代码。 通常可以,不总是直截了当的。
-
客户端必须区分指示通信错误的HTTP状态代码和指示应用程序级别问题的您自己的状态代码。
HTTP状态代码不是你的api的一部分
-
如果您的应用程序收到请求后,HTTP状态码将始终为200,然后进行响应(成功和错误情况)
-
所有的回复都应该包含“信封”或“标题”信息。 通常是这样的:
envelope_ver:1.0 状态:#使用你喜欢的任何代码。 保留一个成功的代码。 msg:“ok”#反映代码的人string。 用于debugging。 data:...#响应的数据,如果有的话。
-
由于响应的状态总是在同一个地方(不需要子代码),对代码没有限制,不需要获取HTTP级别的状态码,这种方法对于客户来说可以更容易。
这里有一个类似的想法:http: //yuiblog.com/blog/2008/10/15/datatable-260-part-one/
主要问题:
-
确保包含版本号,以便稍后可以根据需要更改api的语义。
-
文件…
请记住,除HTTP / 1.1 RFC中定义的状态码外,还有更多状态码,IANA注册处位于http://www.iana.org/assignments/http-status-codes 。 对于你提到的情况代码507听起来是正确的。
正如其他人所指出的,在一个错误代码中有一个响应实体是完全可以允许的。
请记住,5xx错误是服务器端,也就是说,客户端不能改变任何请求通过的请求。 如果超过客户端的配额,那肯定不是服务器错误,所以应避免使用5xx。
我知道这是晚会非常晚,但现在,在2013年,我们有几种媒体types,以通用分布式(RESTful)方式处理error handling。 请参阅application / vnd.error + json( https://github.com/blongden/vnd.error )和“HTTP API的问题详细信息”,application / problem + json( https:// tools。 ietf.org/html/draft-nottingham-http-problem-05 )。
有两种错误。 应用程序错误和HTTP错误。 HTTP错误只是为了让你的AJAX处理程序知道事情正常,不应该用于其他任何事情。
5xx
服务器错误
500 Internal Server Error 501 Not Implemented 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout 505 HTTP Version Not Supported 506 Variant Also Negotiates (RFC 2295 ) 507 Insufficient Storage (WebDAV) (RFC 4918 ) 509 Bandwidth Limit Exceeded (Apache bw/limited extension) 510 Not Extended (RFC 2774 )
2xx成功
200 OK 201 Created 202 Accepted 203 Non-Authoritative Information (since HTTP/1.1) 204 No Content 205 Reset Content 206 Partial Content 207 Multi-Status (WebDAV)
但是,如何devise应用程序错误真的取决于您。 例如堆栈溢出发送一个对象的response
, data
和message
属性。 我相信包含true
或false
的反应,表明操作是否成功(通常是写操作)。 数据包含有效负载(通常用于读取操作),并且消息包含任何额外的元数据或有用的消息(如response
为false
时的错误消息)。
同意。 REST的基本理念是使用Web基础结构。 HTTP状态代码是消息传递框架,允许各方在不增加HTTP有效载荷的情况下相互通信。 它们已经build立了传达响应状态的通用代码,因此,要成为真正的RESTful,应用程序必须使用此框架来传递响应状态。
在HTTP 200信封中发送错误响应具有误导性,并且强制客户端(api消费者)parsing消息,很可能是以非标准或专有的方式进行parsing。 这也不是有效的 – 你将强迫你的客户每次parsingHTTP负载,以理解“真实”的响应状态。 这增加了处理,增加了延迟,并为客户创造了犯错误的环境。
在现有的“最佳实践”上build模您的api可能是一条可行的路。 例如,以下是Twitter如何处理错误代码https://dev.twitter.com/docs/error-codes-responses
不要忘记5xx错误以及应用程序错误。
在这种情况下,409(冲突)呢? 这假定用户可以通过删除存储的资源来解决问题。
否则507(不完全标准)也可能工作。 一般情况下,我不会使用200,除非你使用了200。
请坚持协议的语义。 使用2xx成功响应,使用4xx,5xx作为错误响应 – 无论是您的业务exception还是其他。 如果使用2xx作为协议的预期用例,那么他们首先不会有其他的状态码。
如果超出客户端配额,则为服务器错误,请避免在此情况下使用5xx。