Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/web-services/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services RESTAPI错误返回良好实践_Web Services_Http_Rest - Fatal编程技术网

Web services RESTAPI错误返回良好实践

Web services RESTAPI错误返回良好实践,web-services,http,rest,Web Services,Http,Rest,我正在寻找有关从RESTAPI返回错误的良好实践的指导。我正在开发一个新的API,所以我现在可以向任何方向发展。目前我的内容类型是XML,但我计划将来支持JSON 我现在添加了一些错误案例,例如,一个客户端试图添加一个新的资源,但已超过其存储配额。我已经在用HTTP状态码处理某些错误案例(401用于身份验证,403用于授权,404用于普通错误请求URI)。我查看了受欢迎的HTTP错误代码,但400-417范围中似乎没有一个报告特定于应用程序的错误。因此,一开始我试图用200OK和一个特定的XML

我正在寻找有关从RESTAPI返回错误的良好实践的指导。我正在开发一个新的API,所以我现在可以向任何方向发展。目前我的内容类型是XML,但我计划将来支持JSON

我现在添加了一些错误案例,例如,一个客户端试图添加一个新的资源,但已超过其存储配额。我已经在用HTTP状态码处理某些错误案例(401用于身份验证,403用于授权,404用于普通错误请求URI)。我查看了受欢迎的HTTP错误代码,但400-417范围中似乎没有一个报告特定于应用程序的错误。因此,一开始我试图用200OK和一个特定的XML负载返回我的应用程序错误(即,多付我们钱,你就会得到你需要的存储!),但我停下来想了想,这似乎是索比(恐惧地耸耸肩)。此外,我感觉我正在将错误响应分为不同的情况,因为有些是http状态代码驱动的,有些是内容驱动的

那么,行业建议是什么?好的实践(请解释原因!),还有,从客户机的角度来看,RESTAPI中什么样的错误处理使客户机代码更容易使用

因此,一开始我试图用200OK和一个特定的XML负载返回我的应用程序错误(即,多付我们钱,你就会得到你需要的存储!),但我停下来想了想,这似乎是索比(恐惧地耸耸肩)

除非这个请求真的没有问题,否则我不会退还200英镑。From,200表示“请求已成功”

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

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

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


您还考虑了哪些其他特定的错误情况?

主要的选择是是否将HTTP状态代码视为REST API的一部分

两种方法都很好。严格来说,我同意REST的一个想法是,您应该使用HTTP状态代码作为API的一部分(成功操作返回200或201,根据各种错误情况返回4xx或5xx)。但是,没有REST。你可以做你想做的事。我已经看到更多的非RESTAPI被称为“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. 信封版本:1.0 状态:#使用您喜欢的任何代码。保留成功的密码。 msg:“ok”#反映代码的人工字符串。用于调试。 数据:…#响应的数据(如有)
  • 由于响应的状态总是在同一个位置(不需要子代码),对代码没有限制,不需要获取HTTP级别的状态代码,因此这种方法对于客户端来说更容易

  • 以下是一篇有类似想法的帖子:

    主要问题:

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

  • 文件


  • 请记住,有比HTTP/1.1 RFCs中定义的更多的状态代码,IANA注册表位于。对于您提到的情况,状态代码507听起来不错。

    有两种错误。应用程序错误和HTTP错误。HTTP错误只是为了让AJAX处理程序知道一切正常,不应用于其他任何用途

    5xx
    服务器错误 2xx成功
    然而,如何设计应用程序错误实际上取决于您。例如,堆栈溢出发送具有
    响应
    数据
    消息
    属性的对象。我认为响应包含
    true
    false
    以指示操作是否成功(通常用于写操作)。数据包含有效负载(通常用于读取操作),消息包含任何附加元数据或有用消息(例如当
    响应
    false
    时的错误消息)。

    不要忘记5xx错误以及应用程序错误

    在这种情况下,409(冲突)如何?这假设用户可以通过删除存储的资源来解决问题

    否则为507(非耳鼻喉科)
    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 )
    
    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)