OpenAPI:验证文档背后的契约

内容摘要

OpenAPI 用工具可读格式描述 HTTP 接口。Swagger 是工具生态;文档能够展示,并不证明服务会执行契约。

存放文档和数字证据介质的无人档案室
本文目录

区分描述和执行

固定工具支持的规范版本,描述参数、正文、响应和安全要求。声明安全要求之后,应用及网关仍须实际落实。

要素描述内容额外验证
模式结构和约束实际校验与业务规则。
文档中的响应预期状态和内容实际响应是否符合约定。
安全要求声明的机制和权限每项操作的真实访问控制。
示例一个说明性场景一致性、无秘密及边界情况。

共享前进行审查

  • 检查必填字段、类型、范围、分页、错误和内容格式,使用符合模式的虚构示例,不含秘密或客户数据。
  • 在受控环境中对照描述和真实请求响应,测试无凭据、权限不足及账户之间的隔离。
  • 检查外部引用及解析它们的工具。清理公开描述中的敏感信息,保护私有环境与操作。

持续维护文档

逐次审查差异并指定负责人。生成的客户端或示例即使结构有效,也可能忽略业务规则。交互控制台应使用合适环境和有限权限,清晰标明会改变状态的操作。

一手资料

将 OpenAPI 与运行中的服务进行比较。

一份有效的 OpenAPI 描述应包含失败响应、模式以及客户端实际遇到的示例。如果文档与 API 不符,集成可能在演示环境中运行正常,但在生产环境中却会失败。

  • 将成功和错误案例与描述进行比较。
  • 记录可选值、分页和操作限制。
  • 在更改合同之前,测试一个具有代表性的客户端。

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

ZIP与TAR:在目录和资源预算内解压

发布解压文件前验证路径、链接和实际解压数据量。

  • 在最小权限的新建非公开目录解压。拒绝绝对路径、向上遍历、不必要的链接和特殊文件。按目标系统规则检查实际解析目标及冲突,包括大小写。文本前缀本身不能证明目录限制。
  • 对实际写入字节、条目数、深度、时间和进程资源设单文件及累计上限。不仅依据压缩或声明大小。不需要嵌套档案就拒绝;允许时所有层共享总预算。更新库和过滤器。
  • 测试../、绝对路径、链接、重复项和预算超限。中止应使批次不可发布且不覆盖现有文件。发布前验证文件类型与内容;清理隔离目录时确认目标位置。

可复现的验收案例

虚构示例:数据不代表客户或实际观察结果。

查看案例输入
{
    "compressed_mb": 2,
    "expanded_mb": 600,
    "aggregate_budget_mb": 100,
    "first_files_valid": true,
    "expected": "stop_on_actual_overrun_and_do_not_promote"
}

预期判断

虚构例:2 MB压缩数据产生600 MB,预算为100 MB。实际写入字节超限即停止;即使前几个文件看似有效也不发布该批次。

Python — tarfile extraction filters and further verification

小档案或过滤器能保证安全吗?

不能。小档案可能大幅膨胀。需加入资源上限、路径规则及解压文件验证。

一手资料:Python — tarfile extraction filters and further verification. 相关方法:阅读实用指南.

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

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

Include errors in contract tests

A new type URI, removed extension or changed status may alter consumer behaviour. Failure examples are part of the contract alongside successful responses.

  • Replay existing clients against representative refusals.
  • Check tolerance of unknown extensions and localised text.
  • Document migration of a problem identity and actually observed use.

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