API 的错误代码模式

2024-04-03

API错误代码响应模式有哪些好的选择?

而不是使用不同的代码来指示不同类型的错误

100001 // username not provided
100002 // password not provided
100003 // password too short
...

我看到一些其他使用模式 https://support.multiplay.co.uk/support/solutions/articles/1000128432-why-does-my-card-keep-getting-declined-像下面这样(非顺序)...

20000
20001
20004
20015

还有其他建议吗?


根据我开发和使用 Web 服务的经验,我发现以下策略使用顶级 HTTP 状态代码和较低级别 API 错误代码的组合效果相当好。请注意,较低级别的 API 错误代码不需要是整数,而是可以是任何枚举。对于一个众所周知的公共示例,AWS Simple Email Service (SES) 使用此同时使用 HTTP 状态代码和 API 级别错误代码的策略 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/api-error-codes.html。你可以看到一个SES 的示例错误代码响应此处 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/query-interface-responses.html。请注意,尽管 SES 使用 XML 响应错误负载,但此策略同样适用于 JSON 响应负载。

根据我的经验,使用此策略时需要记住以下几点:

  1. Strive to return the correct HTTP response code: HTTP is a ubiquitous protocol and is no doubt understood by your web container. Its response codes fit naturally into REST web services. As such, leverage it! If your web service encounters an error condition, you should do your best to return the correct HTTP status code in whose context, the API error code has meaning. One my biggest headaches in debugging issues with web services occur when developers just unconditionally throw arbitrary (usually runtime) exceptions back up the stack. The result is that everything gets returned back to the caller as an HTTP 500 (Internal Server Error) status code even when that's not the case (e.g. the client sends garbage data and the server just can't process it. Some common HTTP status codes you might want to design for include:
    • 400 错误请求:客户的请求有问题。请注意,此错误不仅用于 POST 请求中损坏的 JSON 语法之类的情况,还用于它也是语义问题的合法响应代码 https://stackoverflow.com/a/20215807/4851565(即 JSON 请求有效负载符合规定的架构,但有效负载中的数据存在问题,例如本应为正数的数字却为负数)。
    • 401 未经授权:调用者的凭据无效(即授权错误)。
    • 第403章 禁止:调用者的凭据有效,但其访问级别不足以访问资源(即身份验证错误)。
    • 404 未找到:URL 的资源不存在。
    • 500内部服务器错误:服务器本身内部发生了一些不好的事情,这个错误可能是任何错误。
    • 502错误的网关:调用下游服务时发生错误。
    • 503服务不可用:当您受到大量无意中对您的服务进行 DDOS 攻击的“满意”客户的打击时,这是一个有用的响应代码。
    • 504网关超时:与 502 状态代码类似,但表示下游服务本身超时而不是实际错误。
  2. HTTP 响应代码是顶级代码,API 错误代码仅在该上下文中有意义:我的意思是,您的 API 错误代码仅对某些 HTTP 响应代码有意义。例如,在SES 错误代码表 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/api-error-codes.html,每个错误代码仅与单个 HTTP(S) 响应代码相关联。错误代码ConfigurationSetDoesNotExist and InvalidParameterValue只有当400 Bad Request由 SES 返回 - 当 a 时返回这些状态代码是没有意义的500 Internal Server Error被返回。同样,如果您正在编写一个调用下游服务和数据库的 Web 服务,您可能有一个FooDownstreamServiceTimedOut您将返回的错误代码504 Gateway Timeout当下游 Web 服务调用“Foo”Web 服务超时时的 HTTP 状态代码。您可能还有一个MyDatabaseError您将返回的错误代码500 Internal Server Error对内部数据库的查询失败时的 HTTP 状态代码。
  3. 无论状态代码如何,都有统一的错误代码架构:您的客户需要能够以编程方式处理您的错误内容。因此,它需要符合一定的模式。理想情况下,您的 API 错误代码架构应包含错误代码(即名称或 ID 等)。您可能还希望包含错误代码的自然语言描述以及您正在响应的请求的 ID/GUID。有关错误模式的示例,请参阅此示例 AWS SES 响应和架构 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/query-interface-responses.html。此外,您可能还需要考虑在响应中返回客户端 ID。这既符合您自己的利益,也符合客户的利益,因为它可以帮助您深入研究数据,看看某个特定客户与其他客户相比是否出现了过多的特定错误。
  4. 考虑在响应中返回错误代码的自然语言描述:为了让您的客户端更轻松,您可能不仅需要考虑返回错误负载中的错误代码,还需要考虑自然语言描述。这种行为可以立即帮助那些真正不太关心您的服务的困惑而忙碌的工程师快速诊断发生的情况,以便他们能够尽快解决问题。顺便说一句,使工程师能够快速诊断您的服务问题会增加您的客户和经理无疑会关心的最重要的“正常运行时间”指标。
  5. 不要觉得有必要使用整数,而是使用枚举:“错误代码”的概念让人想起过时的技术和密码本,您必须在其中查找错误的含义。它起源于编程黑暗时代,当时工程师需要将所有可能的错误放入一个字节的空间,或半字节或其他任何东西中。那些日子已经一去不复返了,你的错误代码可以是一个字符串,可能不会对性能产生任何有意义的影响。您不妨利用并使错误代码有意义,作为使事情变得简单的一种方法。
  6. 将他们可能需要调试的信息返回给客户端,但要注意安全性:如果可能,返回客户可能需要的任何调试信息。但是,如果您的服务可能涉及信用卡号等敏感信息,那么您可能出于明显的原因不想传递该信息。

希望有帮助。

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

API 的错误代码模式 的相关文章

  • 使用magento中SOAP API的salesOrderInfo获取简单的产品sku和数量

    我在以下代码中添加了 app code core Mage Sales Model Order Api php File public function info orderIncrementId order Mage getModel s
  • 在 Vue js 中获取 JSON 属性时出错

    我在使用 Vue js 时遇到了一个奇怪的行为 我进行 ajax 调用 将结果 一些 JSON 存储到名为 modello 的 Vue 数据属性中 lineaGialla selected false descrizione Questa
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 当我运行反应脚本“yarn start”时,我到index.html中的manifest.json的链接有效,但当我运行“python3 manage.py runserver”时则无效

    当我运行 yarn start 时 我的index html 文件中的manifest json 链接工作正常 但是当我运行时 python3 manage py runserver 我在终端得到的只是 Not Found manifest
  • ajax 成功后循环 JSON 响应

    抱歉 这是重复的here https stackoverflow com questions 733314 jquery loop over json result from ajax success问过 但我对此很陌生 所以我想知道该怎么
  • ReST 代理对象生成器

    第三方公司写了一套ReST服务 我已经让所有代码正常工作 但事后看来 为了消除一些跑腿工作 我认为有人可能知道一个代码生成器 它连接到 ReST 服务并计算出需要创建和生成哪些请求和响应对象这些的代码 我在谷歌上看了一下 但没有看到任何合适
  • 如何在 JSONKit 中 JSON 序列化 NSDate 字典

    我尝试使用 Jsonkit 和 Apple 的 JSON 序列化器 但没有成功 它不断破坏 geo 属性 该属性是 NSNumbers 的 nsarray Post p Post alloc init p uname mike p like
  • Skype API 的实现[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 Skype 插件 https stackoverflow com questions 1149615 skype addon in c sharp 如何在 C 中实现 Skype API 来
  • 将 Backbone 模型和集合保存到 JSON 字符串

    我在将 Backbone Model 或 Backbone Collection 对象保存到本地存储时遇到问题 问题是 当它保存时 只有属性被保存 我不希望这样 我实际上正在使用他们的示例 TODO 演示中提供的主干本地存储 这是他们的保存
  • Spring/Rest @PathVariable 字符编码

    在我使用的环境 Tomcat 6 中 路径段中的百分比序列在映射到 PathVariable 时显然是使用 ISO 8859 1 进行解码的 我希望它是 UTF 8 我已经将 Tomcat 配置为使用 UTF 8 使用 server xml
  • 如何在使用 Piwik 进行分析的页面上显示点击/访问计数器

    我想在主页上显示当天的访问量 该页面由 Piwik 跟踪 如何将 API 与 PHP 结合使用来获取今天的 唯一 访问量和点击量 以便我可以将它们显示在页面上的某个位置 result file get contents http mysit
  • 是否可以将 WSDL 与 REST Web 服务结合使用?

    我是网络服务领域的新手 是否可以将 WSDL 与 REST 绑定一起使用 或者我应该使用 WADL 可以将 WSDL 与 REST 绑定一起使用 但这实际上没有必要 REST 的简单性使得编写代码来使用该服务变得非常容易 使用 WSDL 只
  • 在 Spark 中写入 JSON 时保留具有空值的键

    我正在尝试使用 Spark 编写 JSON 文件 有一些键有null作为价值 这些在中显示得很好DataSet 但是当我写入文件时 密钥会丢失 我如何确保它们被保留 写入文件的代码 ddp coalesce 20 write mode ov
  • 使用 PayPal REST API,如何取消付款?

    使用 PayPal REST API 在客户点击 取消订单并返回网站 链接后 我似乎无法弄清楚如何取消付款 也许在生产模式下 PayPal 会自动取消这些付款 但在沙盒模式下它们似乎仍处于 已创建 状态 这一观察结果使我相信 我需要在返回网
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • 如何从 Android 应用程序调用 REST API? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 android 新手 也是编程新手 如何从 Android 应用程序调用 REST api GET POST 请求 请给我推荐一
  • 如何在 ECMAScript 6 中导入 JSON 文件?

    如何访问 ECMAScript 6 中的 JSON 文件 以下不起作用 import config from config json 如果我尝试导入 JavaScript 文件 这可以正常工作 https www stefanjudis c
  • 替换 WCF 默认 JSON 序列化

    是否可以替换 WCF 的默认 JSON 序列化 我目前正在使用webHttp行为 并通过application json作为 MIME 类型 特别是 我不喜欢默认情况下每个属性都是键 值对 例如 Key PropertyName Value
  • 如何通过groovy动态更新ReadyAPI/SoapUI中的Resource值?

    我的资源采用这种格式 testing 101 getCustomer 99 这里我需要通过 groovy 动态更改 101 和 99 部分 以便我可以在同一测试用例中运行多个值 我研究了 ReadyAPI 的内置功能 但没有那么有帮助 我也
  • 通用开源 REST 客户端? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • PHP 致命错误:未找到“COM”类

    将 PHP 升级到 v 5 5 1 后 我收到此错误 Fatal error Class COM not found in C inetpub wwwroot ndsystems database engine mssql engine p
  • 如何使用 nth-child 为具有行跨度的表格设置样式?

    我有一张表 其中一行使用行跨度 所以 table tr td td td td td td tr tr td td td td td td tr tr td td td td tr tr td td td td td td tr table
  • 如何在 Java 中将日期从 MM/YYYY 转换为 MM/DD/YYYY

    我想将日期从 MM YYYY 转换为 MM DD YYYY 我如何使用 Java 中的 SimpleDateFormat 来做到这一点 注 DD可以是该月的开始日期 请浏览http download oracle com javase 1
  • ggplot 中的概率热图

    I asked this question https stackoverflow com questions 7305803 plot probability heatmap hexbin with different sized bin
  • 如何获取 Linux/UNIX 上当前网络接口吞吐量统计信息? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 MRTG 等工具提供特定接口 例如 eth0 上当前网络利用率的网络吞吐量 带宽图表 如何在 Linux UNIX 上的命令行返回该信息
  • 禁用一个函数的返回值优化

    struct X void a void b X foo void u void v foo 在汇编器中实现 i386 X 类型的返回值的地址作为隐藏参数传递给 foo 如果使用 O0 编译测试代码 则代码将按预期工作 如果使用 O3 编译
  • AH01626:要求全部授权授权结果:已授权

    我在我的网站上运行 apache 2 4 6 我不断在我的 apache 错误日志中看到这条消息一遍又一遍地重复 Tue Nov 10 01 42 40 659710 2015 authz core debug pid 10727 mod
  • 开源 BPM 工具(如 Activiti、bonita)和 Windows Workflow Foundation 之间有什么区别

    我试图找到一个基于asp net的免费开源BPM工具 但不幸的是我没有找到这样的工具 但最近我读到一篇关于Windows Workflow Foundation的文章 那么它是否提供了类似于开源BPM工具如Activiti bonita J
  • 为什么在 WPF 中将 INotifyPropertyChanged 与绑定一起使用?

    我注意到 几乎我在互联网上找到的有关绑定的每个示例都有一个类 绑定到另一个属性 该类继承 INotifyPropertyChanged 接口并在该类属性的 set 部分中使用一个方法 我尝试从绑定示例中删除该部分 其工作原理与该方法相同 这
  • 正则表达式:以不同顺序匹配组而不重复组

    假设我有两个这样的字符串 XABY XBAY 匹配两者的简单正则表达式如下所示 X AB BA Y 但是 我遇到的情况是 A 和 B 是复杂的字符串 我正在寻找一种方法来避免必须将它们分别指定两次 在 的每一侧 有没有办法做到这一点 这可能
  • Laravel Sanctum 自定义守卫

    我的 laravel 应用程序中有多个守卫 Code config auth php defaults gt guard gt user passwords gt users guards gt user gt driver gt toke
  • 目标文件和静态库(归档文件)有什么区别?

    似乎归档文件可以从目标文件生成 ar rvs libprofile a profile o 目标文件和归档文件有什么区别 在我看来 两者都可以直接与 gcc 一起使用 例如 gcc c profile o or gcc c libprofi
  • 为什么我的闹钟马上就响了? (安卓)

    尝试为一周中的某些天设置闹钟 但目前很困惑为什么这个闹钟会立即被触发 无论我以小时和分钟的形式传递什么 我知道一周中的某一天是错误的 只是还没到那一步 public void setReminder int hr int min int d
  • controller.js.coffee 中的函数

    我在使用 CoffeeScript 创建函数时遇到一些问题 我想我错过了一些东西 对于我的用户控制器 我想为注册表单创建客户端验证 我认为我错过了这一切如何运作的一些基本内容 咖啡脚本 资产 users js coffee validate
  • 使 Elixir 应用程序在源代码更改时重新编译并重新加载

    如何在每次修改源代码时自动重新编译并重新加载我的 iex mix 应用程序 如果 iex mix 组合无法做到这一点 那么最简单的替代方案是什么 我已经检查了phoenix的重新加载方法 对于我的小型测试项目来说 它似乎并不容易实现 我也知
  • Excel 在复制时弄乱了我的公式,我怎样才能阻止它更改一部分而不更改另一部分?

    所以我正在使用一个正在更新的旧数据库系统 以前它运行过许多不同的文件 一个包含电子邮件 一个包含数字 你明白了 不管怎样 在尝试编译成一个文件时 我遇到了一个障碍 有些人没有电话号码或电子邮件等 这意味着我不能只是复制旧数据 PersonI
  • 在循环中创建多维数组

    我正在尝试在循环中创建这样的数组 dataPoints array array x gt 4321 y gt 2364 array x gt 3452 y gt 4566 array x gt 1245 y gt 3452 array x
  • 图像地图的绘图点

    我想向网页上的图像地图添加自动区域突出显示 我发现 mapper js 库对于实现此目标非常有用 但是围绕区域地图创建 x y 图非常耗时 有没有一种快速的方法来创建不规则多边形的边界坐标 例如可以在区域地图上找到的坐标 EDIT必须有办法
  • 无法获取socket.io.js

    我实际上正在做一个小项目 我应该用node js mongoDB socket io 和canvas 重新创建一个绘图多人游戏 抽屉工作得很好 服务器似乎也工作得很好 我的注册 登录 会话和数据库已启动并正常工作 唯一的问题是 socket
  • API 的错误代码模式

    API错误代码响应模式有哪些好的选择 而不是使用不同的代码来指示不同类型的错误 100001 username not provided 100002 password not provided 100003 password too sh