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 的错误代码模式 的相关文章

  • IB Java API:提取多个合约的股票数据(实时柱)

    我正在对算法交易和 IB API 进行一些自学和实验 我决定使用 Java 但我愿意切换到 C 我浏览了一个在线教程 该教程将引导您完成下面所示的代码 但我想知道是否可以将其扩展到一只股票之外 我想浏览所有 SP500 股票并检查股票数据
  • Python 中的 JSON 到 YAML:如何获得正确的字符串操作?

    我正在使用PyYAML 库 https github com yaml pyyaml将 json 转换为 yaml 但是引号在不应该的情况下从字符串值中删除了 它们只能从钥匙上移除 我已将 default flow style 选项与 ya
  • JSON 为 foreach() 提供的参数无效

    我在从 JSON 检索数据时遇到一些问题 它总是说为 foreach 提供的参数无效 这是 url php 中的 JSON nama IT SERVICE SOLUTION nilai 0 periode 11 tahun 2014 nam
  • 字典 API(词汇)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个好的 NET 字典 API 吗 我对含义不感兴趣 而是我需要能够以多种不同的方式查询单词 返
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • RESTful API,如果查询字符串不够长怎么办?

    我们有产品资源集合 products 我们希望过滤此集合以仅返回具有特定列表之一的成员class id的 例如 GET products classes 100 101 102 这应该返回具有列出的任何类的产品成员的集合 我们遇到的问题是
  • 获取 JSON 中的 HTML 以在 React 组件中呈现为 HTML

    试图找出如何让链接实际呈现为链接 现在 在我从 Json 文件中读取这行文本后 React 将超链接渲染为文字文本 而不将其渲染为链接 一些数据 json about John has a blog you can read a href
  • Spring Boot 应用程序中的 Vaadin 23 Rest-API 和 UI

    我使用 Vaadin 23 3 5 开发了一个小型应用程序 到目前为止 我仅将 Spring Boot Security 与默认的 LoginView 结合使用来进行身份验证 然后使用 MainLayout 来浏览我的应用程序 但现在我需要
  • 如何将 Laravel 5.4 与 Angular 4 集成

    我知道如何创造完整的拉拉维尔 5 4自己的项目 我也知道如何使用创建 SPA角4 Problem 我不知道如何将 Laravel 与 Angular 集成 另外 我想使用 Laravel 5 4 作为后端 使用 Angular 4 作为前端
  • 使用本地存储在从另一个表保存的 HTML TABLE 中打印 JSON,以便我在另一个页面上打印我的表

    在我的作业中 我必须使用用户输入中的数据并将数据保存在本地存储中 我必须以水平表格式将这些数据从本地存储打印到其他页面 为此 我编写了用于用户输入并将数据保存在本地存储中的代码 div p p div
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • 获取 2 个字母的州/省缩写

    因此 我使用 GeoNames API 获取国家 地区和州 省信息 并使用这些信息填充表单中的选择下拉列表 此表单将其信息提交给 SOAP Web 服务 并且 SOAP 服务器仅理解 2 个字母形式的国家 地区和州 省数据 IE CA 代表
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 如何获取数组作为 GraphQL 解析器的输入

    我想得到一个字符串数组ids查询变量中的参数并在我的解析器中使用它 下面是我的代码 People resolver ts import Resolver Query Mutation Args from nestjs graphql imp
  • REST 将多个输入传递给 GET 方法

    我在 RAD 中部署了一个简单的基于 REST 的应用程序 使用以下方式访问简单的 URLhttp localhost
  • 使用 PHP 从 Mongo 解码 JSON

    我已经看过这个线程 PHP 解码嵌套 JSON https stackoverflow com questions 3555335 php decode nested json并没有设法用它来解决我的问题 我目前正在从 Mongo 获取 J
  • 如何处理 REST api 中的 php 通知、警告和错误?

    在 REST API 中 200 响应表明操作成功 PHP 默认情况下直接在响应正文中输出错误消息 而不更改响应代码 在 SPA 中 用户无法直接看到响应文本 因此 当应用程序未按预期工作时 我通过 FireBug 检查响应正文 以检查可能
  • jQuery:处理 getJSON() 中的错误?

    使用 jQuery 时如何处理 500 错误getJSON http api jquery com jQuery getJSON 有几个关于错误处理的问题getJSON and https stackoverflow com questio
  • GitHub Actions:如何将 toJSON() 结果传递给 shell 命令

    因此 我正在与 Github Actions 合作进行端到端测试 我正在查看的设置是让一项作业检索要测试的 url 列表 而我的第二项作业使用该列表创建一个矩阵并测试所有这些 我的问题是 当我实际运行测试脚本时 必须从命令行完成 因为我使用

随机推荐

  • 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