写点什么

如何版本化你的 API?

  • 2017-09-11
  • 本文字数:1917 字

    阅读完需:约 6 分钟

如何版本化 API 需要考虑各种实际业务场景,但是一个完备的 API 应该是:

  • 和客户端交互的约定。API 需要确保稳定性,预先定义各种可能返回状态,包括各种异常。客户端无需考虑约定之外的情况。
  • 向下兼容。在 API 没有变化的时候,API 实现的更新和升级,都应该确保原有客户端请求不出现问题。
  • RESTful。API 设计应该能够遵照 RESTful 风格,通过 URI 来表示资源,通过 HTTP GET、POST、PUT、DELETE 等方法表示操作行为。

为了满足上述约定,版本化 API 不失为一种保持兼容性的好方法。版本化 API 的通常方式有:

URI 中设置版本

这种方式通常在 URI 中增加一段用于标识版本,例如/v1/v2等。例如:

复制代码
curl https://example.com/api/v2/lists/3

这种方式的优势在于版本信息很容易明显的看出来,可以通过浏览器直接访问。

HTTP 头中设置版本

这种方式的版本信息会放在 HTTP 的请求头中,通常会利用Accept字段,或者自定义一个字段。例如:

复制代码
curl https://example.com/api/lists/3 \
-H 'Accept: application/vnd.example.v2+json'

这种方式的好处是当版本升级时,URI 保持不变,并且仅用于表示资源定位。

没有版本

版本化的目的是为了标识 API 的变化,如果 API 不会变化,或者每次都会重新扩展新的 API,这种情况下,就可以标识版本信息。例如:

curl https://example.com/api/lists/3一种折中方案

前面提到了三种版本化 API 的方式,通常情况下需要针对自己业务的特殊性来挑选其中的一种方式。但是,在实际应用场景中,情况会更加复杂,API 的升级通常有两种情况:

  1. 大版本更新,例如字段类型变更、数据对象变更等。这种情况下无法满足对客户端的向下兼容,因此需要修改版本号。
  2. 小版本更新,例如增加可选参数、增加返回字段等。这种情况对于新客户端可以增加功能,对于老客户端仍然可以保持原有功能,可以不修改版本号。

因此,本文提出的折中方案是基于 URI 中的大版本号和 HTTP 头中的小版本号整合的方式。下面通过一个简单的示例来解释。

用户管理平台

一个常用的用户管理平台,提供以下 API,通过用户 ID 获取用户信息:

复制代码
curl https://example.com/api/v1/user/1
...
{
"id": 1,
"name": "test",
"email": "test@example.com"
}

考虑以下两种变动情况:一种是用户 id 从数字变成了字符串,另一种是新增一个用户头像的值。

前者修改因为数据类型的变化,会导致客户端解析出现问题。因此这样的修改已经破坏了向下兼容性,此时就需要修改 API 的版本号。例如:

复制代码
curl https://example.com/api/v2/user/1
...
{
"id": "1",
"name": "test",
"email": "test@example.com"
}

第二种情况,对于旧客户端来说,只是增加了不使用的字段,通常的 JSON 格式解析库都可以忽略这些不使用的字段。对于新客户端则可以读取新的字段。例如:

复制代码
curl https://example.com/api/v2/user/1
...
{
"id": "1",
"name": "test",
"email": "test@example.com",
"avatar": "http://example.com/1.jpg"
}

这种情况下,基本可以做到向下兼容,因此可以算是“小版本升级”。针对小版本升级,可以将小版本号放到 HTTP 头中。例如:

复制代码
curl https://example.com/api/v2/user/1 \
-H 'API-VERSION: 20170801'
...
{
"id": "1",
"name": "test",
"email": "test@example.com",
"avatar": "http://example.com/1.jpg"
}

后端路由

由于混合版本化的方式同时涉及到 URI 和 HTTP 头字段,前端代理(例如 HAProxy、nginx)可以通过这些特定版本号字段将请求代理到对应的后端应用。

例如,前端使用 HAProxy 进行多版本分发,可以针对 URI 和 HTTP 头定制 acl,然后再对这些 acl 进行组合,设置不同的 backend。

复制代码
acl is_v1 path_beg /api/v1
acl is_v2 path_beg /api/v2
acl is_version_1 hdr(API-VERSION) 20170801
acl is_version_2 hdr(API-VERSION) 20170701
use_backend old_server if is_v1 is_version_1
use_backend new_server if is_v2 is_version_2
backend old_server
...
backend new_server
...

这样可以将 API 版本化规则应用到不同的后端,以保证向下兼容性。

总结

基于本文版本化 API 规则,将“大版本”应用在 URI 上,将“小版本”应用在 HTTP 头字段上。通常来说,如果 API 升级之后破坏了向下兼容性,就应该升级“大版本”号;如果 API 升级可以向下兼容,可以升级“小版本”号。

版本化 API 有很多不同的设计方式,本文仅是其中一种。实际应用时,还是要根据业务场景进行选择,包括 API 版本升级频率,API 稳定性等。通过 HAProxy、nginx 等代理服务,可以在确保向下兼容的情况下,由业务方决定老版本 API 的保留时间。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-09-11 19:008325

评论

发布
暂无评论
发现更多内容

Goldie App for Mac(黄金比例设计软件) v2.2永久激活版

mac

苹果mac Windows软件 Goldie App 黄金比例工具

Vue 实现低代码开发平台,没想到这么好用!

伤感汤姆布利柏

99%的人不知道的Docker干货

伤感汤姆布利柏

Docker 程序员 低代码 干货

HTTPS的安全问题及应对方案

EquatorCoco

网络安全 https 安全

Python subprocess模块的高级玩法

秃头小帅oi

Python 程序员 低代码 subprocess 前沿

Mac综合优化清理软件MacCleaner 3 Pro

展初云

Mac 清理优化 MacCleaner Pro

Aseprite for mac(像素动画制作工具)

展初云

Mac 2D像素风格动画制作软件 Aseprite

打破障碍:克服数字化应用挑战的策略

互联网工科生

数字化

借助工具落地提高外包软件项目代码提交规范

知者如C

使用OSS搭建私有云内网yum仓库的方法

EquatorCoco

云原生 数据 OSS 仓库

产学研合作新篇章:东南大学OpenHarmony技术俱乐部成立,专家进校园共谋发展

科技热闻

Helix QAC 2023.3版本发布,新增对C++20的支持等多个功能,实现100%MISRA C++:2023®规则覆盖

龙智—DevSecOps解决方案

MISRA C++:2023 MISRA C++

上海数交所与合合信息发布产业数据行业创新中心,政产学研合力为“数据航母”加速

合合技术团队

合合信息 上海数交所 产业数据行业创新中心 2023全球数商大会

综合清理优化工具:MacCleaner 3 Pro 激活中文版

mac大玩家j

Mac软件 清理工具 清理优化软件

办公软件定制开发在企业发展中的优势

Geek_16d138

APP软件开发 软件定制

ASP.NET Core Web API设置响应输出的Json数据格式的两种方式

EquatorCoco

json 前端 ASP.NET Core .NET 7

云小课|HSS教您如何应对LockBit勒索事件

华为云开发者联盟

云计算 后端 华为云 主机安全 华为云开发者联盟

IIOT IPQ8074-TWT technology - reduces unnecessary power consumption

wifi6-yiyi

iiot IPQ8074

天猫商品详情API接口深度解析与应用

tbapi

天猫 天猫数据接口 天猫商品详情数据接口 天猫商品API接口 天猫API接口

Mac安装Windows应用的工具CrossOver 23.7

展初云

AutoCAD 2023密钥序列号最新

胖墩儿不胖y

Mac软件 cad cad工具

【专业测试工具推荐】优化测试流程,高效完成测试工作!

Liam

程序员 测试 自动化测试 接口测试 测试工具

企业如何选择安全又快速的大文件传输平台

镭速

大文件传输 大文件传输平台

什么是工业元宇宙?如何利用版本控制来应对工业元宇宙的挑战?

龙智—DevSecOps解决方案

元宇宙

优雅实现API接口开关:让你的应用更可控

树上有只程序猿

spring-boot API接口

《社交泛娱乐出海作战地图》加印领取啦!

融云 RongCloud

地图 社交 泛娱乐 出海 一图流

集群 CPU 利用率均值达 45% ,揭秘小红书规模化混部技术实践

小红书技术REDtech

cpu #云原生

如何版本化你的API?_架构_金灵杰_InfoQ精选文章