REST API错误返回最佳做法

当涉及从REST API返回错误时,我正在寻找有关良好实践的指导。 我正在研究一个新的API,所以我现在可以把它放在任何方向。 我的内容类型目前是XML,但我计划在未来支持JSON。

我现在添加一些错误情况,例如客户端尝试添加新资源但已超出其存储配额。 我已经在使用HTTP状态代码处理某些错误情况(401用于身份验证,403用于授权,404用于普通的错误请求URI)。 我查看了幸运的HTTP错误代码,但400-417范围没有一个报告特定于应用程序的错误。 所以起初我很想用200 OK和一个特定的XML有效载荷返回我的应用程序错误(即支付给我们更多,你将得到你需要的存储!),但我停下来考虑它,它似乎肥皂(/恐怖耸耸肩)。 除此之外,我觉得我将错误响应分成不同的情况,例如一些是由http状态代码驱动的,另一些是内容驱动的。

那么行业建议是什么? 良好的实践(请解释原因!)以及来自客户端pov的REST API中的错误处理是否会使客户端代码更轻松?


所以起初我很想用200 OK和一个特定的XML有效载荷返回我的应用程序错误(即支付给我们更多,你将得到你需要的存储!),但我停下来考虑它,它似乎肥皂(/恐怖耸耸肩)。

除非请求没有任何问题,否则我不会返回200。 从RFC2616开始,200表示“请求已成功”。

如果客户的存储配额已超出(无论出于何种原因),我会返回403(禁止):

服务器了解请求,但拒绝履行它。 授权不起作用,请求不应重复。 如果请求方法不是HEAD并且服务器希望公开为什么请求没有被满足,那么它应该描述在实体中拒绝的原因。 如果服务器不希望将该信息提供给客户端,则可以使用状态码404(未找到)代替。

这告诉客户端请求是好的,但是它失败了(200是不行的)。 这也使您有机会在响应主体中解释问题(及其解决方案)。

你有什么其他具体的错误条件?


一个很好的资源,可以为您的API选择正确的HTTP错误代码:http://www.codetinkerer.com/2015/12/04/choosing-an-http-status-code.html

文章摘录如下:

从哪儿开始:

在这里输入图像描述

2XX / 3XX:

在这里输入图像描述

4XX:

在这里输入图像描述

5XX:

在这里输入图像描述


主要选择是否要将HTTP状态代码作为REST API的一部分来处理?

两种方式都很好。 我同意严格地说,REST的一个想法是,您应该使用HTTP状态代码作为您的API的一部分(根据各种错误情况,返回200或201代表成功操作,返回4xx或5xx代码)。 ,没有REST警察。 你可以做你想做的。 我看到更多令人震惊的非REST API被称为“RESTful”。

此时 (2015年8月),我建议您使用HTTP状态代码作为API的一部分。 使用框架比现在更容易看到返回代码。 特别是,现在更容易看到非200回复​​案件和非200回复​​案件的情况比过去更加容易。

HTTP状态代码是您的api的一部分

  • 您需要仔细选择符合您的错误条件的4xx代码。 您可以包含一个rest,xml或明文消息作为包含子代码和描述性注释的有效内容。

  • 客户将需要使用一个软件框架,使他们能够获得HTTP级别的状态代码。 通常可以做到,而不总是直截了当。

  • 客户端必须区分指示通信错误的HTTP状态代码和指示应用程序级别问题的您自己的状态代码。

  • HTTP状态代码不是你的api的一部分

  • 如果您的应用程序收到请求,然后回复(成功和错误情况),HTTP状态代码将始终为200,

  • 您的所有回复都应该包含“信封”或“标题”信息。 通常是这样的:

    envelope_ver: 1.0
    status:  # use any codes you like. Reserve a code for success. 
    msg: "ok" # A human string that reflects the code. Useful for debugging.
    data: ...  # The data of the response, if any.
  • 由于响应的状态总是处于相同的位置(不需要子代码),对代码没有限制,不需要获取HTTP级别的状态代码,这种方法对于客户来说可以更容易。

  • 这里有一个类似的想法:http://yuiblog.com/blog/2008/10/15/datatable-260-part-one/

    主要问题:

  • 确保包含版本号,以便稍后可以根据需要更改api的语义。

  • 文件...

  • 链接地址: http://www.djcxy.com/p/1219.html

    上一篇: REST API error return good practices

    下一篇: Overriding a MIME type in Rails