跳到正文

OpenAPI 变更对比

OpenAPI Diff

比较两份 OpenAPI 文档,把破坏兼容的变更和纯粹新增的分开列。

比较一份 OpenAPI 文档的两个版本,把改动分成破坏性的和纯新增的。它用的规则写在页面上:如果旧文档接受的请求现在可能被拒绝,或者它承诺的响应变成了现有客户端无法再处理的,这个改动就是破坏性的。

🔒 完全在你的浏览器里运行openapidiffapibreaking-change

旧文档

拖入旧版本

只在这个标签页里读取。

新文档

拖入新版本

只在这个标签页里读取。

破坏兼容

8

向后兼容

7

判定

需要升主版本号

查看

GET /pets

  • 破坏兼容`in: query` 参数 `limit` 现在是必填的了。
  • 新增新增了一个可选的 `in: query` 参数 `sort`。
  • 修改摘要或说明变了。

GET /pets · responses["200"].content["application/json"]

  • 破坏兼容`[].id`的类型从 integer 变成了 string。
  • 破坏兼容属性 `[].name` 现在是可选的了。
  • 破坏兼容`[].status`的 enum 里多了 "pending"。
  • 新增新增了一个可选属性 `[].owner`。

GET /pets/{petId} · responses["200"].content["application/json"]

  • 破坏兼容`id`的类型从 integer 变成了 string。
  • 破坏兼容属性 `name` 现在是可选的了。
  • 破坏兼容`status`的 enum 里多了 "pending"。
  • 新增新增了一个可选属性 `owner`。

GET /pets/{petId}

  • 破坏兼容`404` 响应没了。

DELETE /pets/{petId}

  • 新增新增了这个操作。

components.schemas.Owner

  • 新增新增了一个 schema。

info.version

  • 修改`1.0.0` → `2.0.0`

什么算破坏兼容

一句话说:旧文档原本接受的请求现在可能被拒,或者旧文档承诺的响应现有客户端已经处理不了。所以:删掉路径、操作、响应码、媒体类型或响应属性;加上必填参数或必填的请求属性;可选变必填;类型变化;删掉请求 enum 的值;加上响应 enum 的值(客户端的 switch 里没有对应的 case);以及响应属性从必填变可选——这些都算破坏兼容。反方向的改动,以及说明、标签、operationId 和 deprecated 标记的改动,都是兼容的。

  • · schema 是先跟着文档内部的 $ref 解开再比的,所以只给组件改个名字不算变更。路径参数也按位置而不是按名字对上。
  • · oneOf·anyOf·not 的内部是整块比的,不一样就报成破坏兼容,这里不去推理里面的含义。
  • · 指向另一个文件的 $ref 不会跟进去。请先把这些文件打包成一份。

要检查单独一份文档,可以用 OpenAPI 检查。

怎么用

  1. 把旧文档和新文档并排放好

    两边都可以是 JSON 或 YAML。两者都在这个标签页里解析,所以一份未发布的规范不会离开你的机器。

  2. 读结论

    破坏性改动的数量、新增的数量,以及这对版本号意味着什么:升主版本、升次版本,或者因为契约没变而什么都不用动。

  3. 筛出破坏性的那些并读一遍

    按操作分组,每条带着改了什么。Markdown 副本的形状适合放进 pull request 描述。

常见问题

为什么给响应的枚举加一个值是破坏性的?

因为现有客户端有一个没有为它准备分支的 switch。给*请求*的枚举加值是安全的——服务端比以前接受得更多;给响应的枚举加值,是给客户端发送它们从未被告知的东西。方向决定一切。

我重命名了一个组件,它报告没有改动。

正确。schema 是在跟随 `$ref` 之后比较的,所以一个形状相同、只是改了名的组件是同一份契约。`components` 里的名字是内部的;客户端看到的是解析后的形状。

响应里一个必填属性变成可选真的是破坏性的吗?

是的,从客户端的角度看。它被承诺过这个字段总会在,它的代码无条件地读它;改成可选意味着服务端现在可以省略它。必填和可选在请求和响应之间方向互换,这正是人们弄反的地方。

它怎么处理 `oneOf` 和 `anyOf`?

作为一个整体比较,只要有任何不同就报告为破坏性的。推理一个联合是不是另一个的超集,是这里有意不去尝试的判定过程;一个你可以驳回的假「破坏性」,好过一个你无法驳回的假「安全」。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。