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

2024-06-18

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

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

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

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

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

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

编辑:还发现这个现有的讨论 https://stackoverflow.com/questions/2190945/what-http-response-code-for-rest-service-on-put-method-when-domain-rules-invalid同一主题的。所有答案似乎都指向使用状态代码来处理此类违规,并在使用 400、409 或 422 扩展之间进行了一些讨论。


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


From [RESTful Web Services Cookbook][1]:

某些 Web 服务常犯的一个常见错误是返回状态 反映成功的代码(状态代码从 200 到 206 以及从 300 到 307),但包括描述错误情况的消息正文。 这样做可以防止 HTTP 感知软件检测到错误。为了 例如,缓存会将其存储为成功响应并将其提供给 后续客户,即使客户可能能够取得成功 要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于一般不成功的请求(不是错误),适当的 HTTP 状态代码响应是什么? 的相关文章

随机推荐

  • UILocalNotification 播放自定义声音

    我在我的应用程序中实现了本地通知 但我只是想知道是否有一种方法可以播放不属于 iPhone 应用程序主包的一部分的声音 基本上在我的应用程序中 我希望用户录制生成本地通知时播放的声音 而不是播放预先录制的或默认的声音 据我所知 这是可以实现
  • 数组所有可能的组合

    我有一个字符串数组 ted williams golden voice radio 我希望这些关键字的所有可能组合采用以下形式 ted williams golden voice radio ted williams ted golden
  • 如何通过API网关从lambda正确返回二进制文件(图像)

    这是我的 lambda exports handler async event gt const hex 89504e470d0a1a0a0000000d49484452000000a0000000a00800000000aea438f10
  • 如何将curlpp 添加到我的项目中?

    我正在尝试从 vb net 过渡到 C 但我陷入了困境 我从下载了curpp这给了我一个 dll exp 和 lib 文件 我将包含这 3 个文件的目录添加到项目属性中的 附加库目录 链接器 gt 常规 接下来 我将 ws2 32 lib
  • Artifactory OSS 源代码位于哪里?

    我可以下载最新的 Artifactory OSS 版本 5 2 1 但我似乎找不到它的源代码 Artifactory 文档链接到https api bintray com content jfrog artifactory jfrog ar
  • UITextField 在模拟器中崩溃,但在 iPhone 4 (4.2) 中则不然

    我面临一个奇怪的问题 不知道如何解决 我的应用程序中有一个带有 3 个文本字段的简单视图控制器 我已在 h 中将它们定义为 IBOutlet 并将它们与文件的所有者链接起来 其中两个使用默认键盘定义 另一个使用手机键盘键盘 当我尝试编辑电话
  • Anaconda:ModuleNotFoundError:没有名为“conda”的模块

    请注意 此错误与 stackoverflow 中显示的错误 并有答案 不同 它绝对不是重复的 我以前见过这个错误 并且能够通过修改 PATH 以包含 conda 的路径来修复它 如下所示 export PATH opt cloudera p
  • 使用 node-sass 监视整个目录时指定输出文件名

    目前 我可以在查看单个 SCSS 文件时使用 package json 文件中的 node sass build 命令指定文件名 sass build node sass src scss main scss dist css main m
  • 为什么删除void*是UB而不是编译错误?

    为什么要通过删除对象void 是未定义的行为 而不是编译错误 void foo void p delete p 这段代码编译并生成代码 尽管有关于 gcc 和 clang 的警告 令人惊讶的是 ICC 没有给出警告 2 5 warning
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • (int *)0 是空指针吗?

    这可以被认为是一个扩展这个问题 https stackoverflow com q 16563114 912144 我只对 C 感兴趣 但添加 C 来完成扩展 C11 标准 6 3 2 3 3 规定 值为 0 的整数常量表达式 或此类表达式
  • 通过django s3中间件保存文件时获取Http403(但可以在shell中使用boto保存)

    我一直在尝试通过 django 应用程序将用户上传的文件保存到我的 s3 存储桶中 我正在使用django s3 storage https github com etianen django s3 storage中间件 但我不断收到 S3
  • 动态加载编译的 Haskell 模块 - GHC 7.6

    我正在尝试使用 GHC API 动态编译和加载 Haskell 模块 我知道 API 从一个版本到另一个版本波动很大 所以我专门谈论 GHC 7 6 我尝试在 MacOS 和 Linux 上运行相同的代码 在这两种情况下 插件模块都可以正常
  • R 中的 NA 替换函数

    我正在尝试替换矩阵中的 NA mat 零 我在用着mat is na mat lt 0 当我有 18946 个变量的 94531 个观察值或更小的矩阵时 效果很好 但我在 22752 个变量的 112039 个观察值的矩阵上尝试它 R 显示
  • 捕获 subprocess.run() 的输入

    我在 Windows 上有一个交互式命令行 exe 文件 是由其他人编写的 当程序出现异常时 它会终止 并且我对程序的所有输入都会丢失 所以我正在编写一个 python 程序 它调用一个阻塞子进程subprocess run 并捕获所有输入
  • 嵌套对象的 setState

    我有一个嵌套对象作为状态 并且在组件中有一个表单 我正在考虑每次用户在表单中输入某些内容时更新状态 并且为了避免为每个输入创建许多函数 我正在考虑使用 switch 创建单个函数 使用 switch 创建单一函数是个好主意吗 如何更新对象的
  • 如果 windowTranslucentStatus 为 false,则不会调用键盘的 onApplyWindowInsets

    正如标题所说 我有一个Activity我想在其上处理键盘的插入 底部有一个视图 不应该推上去 但其余的观点应该被推高 我可以使用很好地处理插图onApplyWindowInsets IF windowTranslucentStatus设置为
  • <输入类型=按钮> 与 <按钮> [重复]

    这个问题在这里已经有答案了 我有点困惑 这些有什么区别呢 请不要引用非常旧的帖子 我注意到在 html 和样式表中访问某些样式是不同的内联样式
  • MVC3 Ajax.ActionLink

    对于以下情况 Ajax ActionLink Delete Delete AdminGroup new id item AdminGroupId new AjaxOptions Confirm Delete HttpMethod Delet
  • 对于一般不成功的请求(不是错误),适当的 HTTP 状态代码响应是什么?

    我正在创建一个 RESTful API 它将处理许多用户交互 包括使用存储的信用卡下订单 如果订单成功 我将返回 200 OK 如果订单请求格式错误或无效 我将返回 400 Bad Request 但如果订单实际处理过程中出现问题 我该怎么