http - 一般不成功请求(不是错误)的适当 HTTP 状态代码响应是什么?

标签 http rest http-status-codes

我正在创建一个 RESTful API,它将处理大量用户交互,包括使用存储的信用卡下订单。

如果订单成功,我将返回 200 OK,如果订单请求格式错误或无效,我将返回 400 Bad Request。但是在实际处理订单的过程中出现问题怎么办?

  1. 客户端向服务器发送请求以获取用户资源。如果用户不存在,返回404 Not Found。
  2. 订单格式和信息得到验证。如果无效,则返回 400 Bad Request。
  3. 订单已处理。如果订单成功,则会为订单返回 201 Created。如果遇到意外错误,将返回 500 服务器错误。

最后一步是问题所在 - 如果订单因任何其他原因未完成,我该如何返回?可能的情况可能包括:

  • 产品已售罄
  • 已达到用户最大订单限制
  • 信用卡交易失败(资金不足等)

这似乎不适合 400 或 500。如果没有更好的代码,我可以将其视为 400 - 根据业务规则,请求无效。它只是看起来不准确。

编辑:还发现 this existing discussion同一个话题。那里的所有答案似乎都指向对此类违规使用状态代码,并在使用 400、409 或 422 扩展名之间进行了一些讨论。

最佳答案

您应该将 4xx 用于业务规则。如果订单未被接受,请不要返回 2xx。 HTTP 是一种应用程序协议(protocol),永远不要忘记这一点。如果您返回 2xx,则无论您在正文中发送任何信息,客户都可以假定订单已被接受。


来自 [RESTful Web 服务指南][1]:

One common mistake that some web services make is to return a status code that reflects success (status codes from 200 to 206 and from 300 to 307) but include a message body that describes an error condition. Doing this prevents HTTP-aware software from detecting errors. For example, a cache will store it as successful response and serve it to subsequent clients even when clients may be able to make a successful request.

关于http - 一般不成功请求(不是错误)的适当 HTTP 状态代码响应是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9381520/

相关文章:

visual-studio - Http到https。 IIS还是Visual Studio?

Java HttpGet 不接受 gzip

php - 微服务架构中的 JWT 身份验证

rest - 以 REST、curl 形式表示 Kibana 查询

http-status-codes - 对于缺少的必需参数,返回的正确 HttpStatusCode 是什么?

ruby-on-rails - 使用 respond_with 服务 404?

Java:如何使用数据进行 API 调用?

node.js - Microsoft Graph API,DELETE 请求响应错误代码 403 ""访问被拒绝。检查凭据并重试。”

java - Jersey 多部分表单数据默认值?

ios - 当在 iOS Swift 3 中以编程方式添加 Web View 以查看时,如何在 UIWebView 中获取响应状态代码?