API 错误:明确下一步而不泄露秘密

内容摘要

错误响应应帮助调用方决定修正输入、更新认证、申请权限还是等待。公开提示与内部诊断需要不同详尽程度。

无人值守的安全服务器与网络机房通道
本文目录

区分状态、类型和具体事件

RFC 9457 定义 application/problem+json。使用稳定的问题类型及针对本次事件的清楚说明;客户端不应解析翻译后的自然语言来决定动作。若含 status 成员,应与实际 HTTP 状态一致。

状态HTTP 含义可考虑的处理
400请求不正确修正后再尝试。
401缺少有效认证信息检查凭据和约定机制。
403已理解但拒绝请求检查权限;重复不会获得权限。
503服务暂时不可用操作允许时,限定等待和重试。

让失败路径可预期

  • 说明状态码、格式和预期处理,并测试空响应、网关的非 JSON 内容、连接中断和超时。
  • 在服务端验证输入与权限。处理预期错误而不掩盖未知故障,不要将业务失败伪装为成功响应。
  • 返回可供支持团队使用的关联标识,不在公开响应中包含堆栈、内部查询、密码或令牌。

只在合理时重试

5xx 并不许可无限重试。结合契约、操作状态、幂等性和总期限判断。报告缺陷时提供最小且脱敏的复现;修复后重测原场景及相邻的拒绝访问场景。

一手资料

API 错误应指导操作,避免信息泄露。

HTTP 状态提供初始类别,但客户端可能需要稳定的类型和有用的详细信息。RFC 9457 描述了常见的错误结构;它并不支持暴露内部跟踪或敏感数据。

  • 区分永久拒绝、可纠正的输入和临时故障。
  • 记录每个重要错误的类型、状态和客户端可能采取的操作。
  • 测试响应是否不包含密钥或不必要的完整有效负载。

一手资料:IETF RFC 9457 — Problem Details for HTTP APIs. 相关方法:阅读实用指南.

API重试:计算端到端时间预算

规定调用上限和全局期限。

虚构教学案例:数字不代表CIE或客户实绩。

虚构模型:四次调用各上限250毫秒,等待100、200、400;不含抖动、连接、队列和本地验证。

总尝试次数
41 + 3
累计等待(ms)
700100 + 200 + 400
模型预算(ms)
17004 × 250 + 700
分解序列
步骤调用上限(ms)下次等待(ms)
尝试1250100
尝试2250200
尝试3250400
尝试42500
总计1000700
模型时长(ms)
  • 调用时间1,000
  • 累计等待700
  • 全局期限(ms)1,500

得出结论前的检查

  1. 1000 + 700 = 1700超过1500毫秒期限。
  2. 传递全局期限,防止重复效果;超时不证明远端取消处理。

试算重试预算

n × T + W × (2^(n−1) − 1)

相关方法:阅读实用指南.

API错误:类型、状态与证据

此语言版本的详细参考说明以英语提供。

Handle an error without parsing its sentence

An API client may receive a translated title, missing member or unfamiliar extension. Preserve decisions based on the documented type and HTTP status, then connect a safe action to the context.

  • Compare received status and JSON status without silently replacing either.
  • Test absent type, string status instead of a number, and an unknown extension.
  • Separate person-facing text, business code and occurrence reference.

Explore problem types and eight fictional responses →

IETF · M. Nottingham, E. Wilde, S. Dalal · RFC 9457 · July 2023 · obsoletes RFC 7807 · §3.1, §3.2, §4.2, §5