了解 REST 响应和 HTTP 状态码
Posted
技术标签:
【中文标题】了解 REST 响应和 HTTP 状态码【英文标题】:understanding REST Response and HTTP status code 【发布时间】:2012-06-12 15:14:50 【问题描述】:我想知道我应该如何在我的 REST API 中响应。
有效示例:
http://blah.com/api/v1/dosomething/123
以上是一个有效的请求,目前我的 HTTP 状态为 200,带有 JSON 响应
"dosomething":
"status": "OK",
"results": "123"
现在我的问题是,如果传递的参数无效(我期待一串整数),我是返回 200 的 HTTP 响应并在 JSON 响应中传递错误状态还是应该传递一些东西像 HTTP 400 响应(错误请求)并在 JSON 响应中列出请求的错误/问题?
错误示例:
http://blah.com/api/v1/dosomething/123a
JSON 响应:
"dosomething":
"status": "ERROR",
"errors": [
"Value passed: |123a| must be a integer."
]
我的问题是我应该在传递的参数不是我期望的请求上传递 200 还是 400 HTTP 状态?还是应该在请求有效时始终是 200 响应?
什么是最佳实践?
【问题讨论】:
【参考方案1】:使用 404。总是。 404. 否则就是误解了URI和资源的性质。如果http://blah.com/api/v1/dosomething/
标识了资源,而123a
只是它的一个参数,那么其他代码可能有意义。但它没有:http://blah.com/api/v1/dosomething/123
标识资源。如果不存在这样的资源,则返回404 Not Found
。
您可能拥有一些处理资源http://blah.com/api/v1/dosomething/123
和http://blah.com/api/v1/dosomething/123a
的实现细节,但它不是资源。来自 Roy Fielding 的dissertation:
"资源不是存储对象。资源不是 服务器用来处理存储对象的机制。这 资源是一个概念映射——服务器接收标识符 (标识映射)并将其应用于当前映射 实现(通常是特定于集合的深度树的组合 遍历和/或哈希表)找到当前负责 处理程序实现,然后处理程序实现选择 基于请求内容的适当操作+响应。所有这些 特定于实现的问题隐藏在 Web 界面后面; 他们的性质不能由只有访问权限的客户承担 通过 Web 界面。”
【讨论】:
如果是错误的域怎么办(例如,我不小心在 prod 上使用了 qual 服务器)?还是 api/v2/dosomething/123?或 api/v1/dosomethingwrong/123?还是 api 网关/CDN 上的 404 配置错误并且没有将请求转发到源?还是指向错误主机的不良 DNS 记录?从实际应用程序代码中返回 404 使得所有这些都成为一个绝对的 PITA 来梳理。并不是说我不同意这是正确的“REST”答案,只是 REST 中的错误处理违反了分层。【参考方案2】:作者编辑:422 是错误的答案。我误解了最初的问题并给出了无效的答案。请看@fumanchu 的回复:https://***.com/a/10955717/441250。我下面的回答是错误的。
我建议使用“422 Unprocessable Entity”并在您的回复正文中包含失败信息。
422(不可处理实体)状态码表示服务器 了解请求实体的内容类型(因此 a 415(不支持的媒体类型)状态码不合适), 请求实体的语法正确(因此为 400(错误请求) 状态码不合适)但无法处理包含的 指示。例如,如果 XML 请求正文包含格式正确(即语法正确),但 语义错误的 XML 指令。
在处理错误时使用“200 Ok”或任何其他状态代码是不可接受的。
附: 状态码列表: http://www.iana.org/assignments/http-status-codes/http-status-codes.xml
【讨论】:
所以有一个正确的 HTTP 状态可以响应。我使用的是 1.0 还是 1.1 HTTP 协议版本有关系吗? Phil:没关系,但是——在这种情况下——422 根本不是正确的响应。对于初学者,此请求中没有有效负载(请求实体)。 (不过,在其他情况下,422 是正确的响应) @Julian 你是绝对正确的,我误解了最初的问题。 Phill 422 不是正确的状态码,我假设您正在执行写操作。 如果有人带着类似但不完全相同的问题来到这里,请支持您的答案以及它包含有用的信息。此外,当您更新它以指出这是该问题的错误答案时;好吧,看好你。 :)【参考方案3】:HTTP 400 用于表示 HTTP 请求本身存在问题(例如无效的 HTTP 标头)。虽然您没有收到您期望的参数,但该请求仍然是一个有效的 HTTP 请求,因此我会返回 200 响应,但在您的 JSON 中包含缺少参数的详细信息。
【讨论】:
这是一个常见的误解。 400 是客户端应用程序错误,因此它可能代表整个失败案例。最新的 Httpbis 规范更改了 400 错误的措辞,以表明它可以更广泛地应用tools.ietf.org/html/…以上是关于了解 REST 响应和 HTTP 状态码的主要内容,如果未能解决你的问题,请参考以下文章