2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

Web API 的版本控制方案分析

  • 2011-11-18
  • 本文字数:1210 字

    阅读完需:约 4 分钟

源于对 OpenStack Api 版本控制约束问题的探讨,Mark Nottingham 在其博客中分析了云中 Web API 各种版本控制机制。他说,如果将 Web 上的版本 控制与软件版本控制做比较的话,软件版本控制成熟得多,而且一般来说更易于理解。

开发者们习惯了软件版本控制。譬如,在每次发版时都会推出一个版本号。版本号通常包含主版本号和小版本号,有时也会有诸如包版本号之类的称呼。 这种细粒度的版本标识对开发者和用户都非常有益;这些标识的简洁语义有助于判断兼容性和开发过程中的调试。

他接着说,但是,这样的版本思路不能很好地转化成 Web API 的版本控制。

使用了前一 API 版本的用户必须要判断如何用新版 API 进行工作。虽然他们猜测两个版本间应该是兼容的,但是他们却无法肯定。所以,他们仍然需要重写一堆 API。

[……] 简单地将软件版本控制的方法用于 Web API 也抵消了人们使用 HTTP 时得到的许多价值。如果你非要这么做,还不如使用“愚钝”的 RPC 协议。

Mark 认为,Web API 版本控制的主旨是保留与现有用户的兼容性。

一个基本原则是,不能破坏现有用户。他们实现了什么,你无从得知,也无法控制。

他还指出:

[……]Web API 的版本控制本质上是非线性的。换言之,当你产生一个新标识符时,你就产生了一个全新的东西,不论它是一个 HTTP 头、媒体类型标识还是一个 URI。你甚至可以用“foo”和“bar”来代替“V1”和“V2”。

他还就如何使用 HTTP 头的扩展机制实现多种版本控制给出了样例。他倡导通过产品令牌(product tokens)标识并解决实现问题。

他将 Web 上的版本控制分为两类:表现格式变更和资源变更。

很多人(如 Dave )已经充分讨论过表现格式变更的问题了。它们既简单又复杂得让人恼火。总而言之,不要做向后不兼容的更改,如果非要做,就得改变媒体类型。

Mark 认为对资源的变更是一个更为有趣的问题。URI 是经历过尝试和测试的大众较接受的版本控制方法。接受度差一点的方法是超媒体(hypermedia )。

REST 迷们研究在 Web API 中使用 HATEOS 标识已经有很长时间了,而且 Roy 也对许多人不知道这一方法表示惋惜

Mark 的文章中也就使用超媒体公布资源元数据的方法给出了示例。客户端可以通过这些元数据以及服务端提供的各自资源模板来生成 URI。

这样,你就不再需要为接口生成不同的 URI,因为由代理驱动的内容商定能够有效地使用这一入口。

他承认有些人赞同使用 HATEOAS,也有些人反对,但是该解决方案带来的扩展性优势能够作为支持它的强有力的论据。

我认为,[译注:HATEOAS] 的核心观点是,URI 已经用于表示太多东西了——持久标识符、缓存键值、相关性解析、书签等——若再加上版本控制和扩展信息,超负荷使用 URI 的结果只能使其使用效果更差。通过把这些关注点转移到 HATEOAS 的链接关系和媒体类型中,你得到的是一个灵活的、拥抱未来的系统,它能够以可控的方式演进,而无需放弃享受 HTTP(不考虑 REST 了)的益处。

这里有作者原始的分析


查看英文原文: Analysis Of Web API Versioning Options

2011-11-18 00:295064
用户头像

发布了 184 篇内容, 共 84.8 次阅读, 收获喜欢 8 次。

关注

评论

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

一张图进阶 RocketMQ - 消费者这个大冤种

三此君

RocketMQ 消息队列 消费者consumer 签约计划第三季

types-paddle: 为Paddle增加Tensor类型注释特性

吴京

Python paddle machine-learning

相辅相成!沈子瑜掌舵魅族科技,互相协同迈入多终端互联生态

极客天地

他居然发邮件请我去吃饭——邮件伪造那些事儿

Regan Yue

网络安全 8月日更 8月月更 邮件伪造

何为项目

尚影嫣

项目管理 8月月更

selenium脚本编写注意点(二)

Xd

RxJS实现“搜索”功能

掘金安东尼

前端 函数式编程 8月月更

Android进阶(十三)json应用

No Silver Bullet

json android 8月月更

物联网数据正在改变世界

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

大融合!魅族星纪时代达成战略合作,董事长沈子瑜透露未来大动作

极客天地

基于EFK的Kubernetes日志采集方案

Albert Edison

Kubernetes EFK 签约计划第三季 日志收集架构

JAVA开源商城系统

源字节1号

后端开发

极狐 GitLab 冷知识:使用 Email 也可以创建 Issue?

郭旭东

极狐GitLab JIHULAB 101

开源一夏|OpenHarmony中FA模型中应用包结构的参数

坚果

开源 OpenHarmony 8月月更

兄弟携手!魅族与星纪时代共同发力出行领域,沈子瑜成舵手

极客天地

魅族与星纪时代合作,沈子瑜透露品牌计划!补全消费者业务布局成关键

极客天地

STM32入门开发 采用IIC硬件时序读写AT24C08(EEPROM)

DS小龙哥

8月月更

开源一夏 | JS超集对TypeScript的Map对象以及联合类型的深入实战

恒山其若陋兮

开源 8月月更

极狐 GitLab 冷知识:Quick Actions 快速操作 Issue

郭旭东

极狐GitLab JIHULAB 101

Android进阶(十四)Android Adapter详解

No Silver Bullet

android Adapter 8月月更

使用 Kitten 开发一款趣味成语接龙游戏

汪子熙

少儿编程 scratch 8月月更 kitten 成语接龙

开源一夏 |Aeraki --- 管理 Istio 服务网格中任何 7 层协议

叶秋学长

开源 云原生 8月月更

如何成为一名合格的文案:需要具备哪些技能

石头IT视角

明年 Flyme 就上车?魅族与星纪时代战略合作后,携手发力出行领域

极客天地

MySQL 原理与优化:行锁

老崔说架构

RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)

矜辰所致

RT-Thread 8月月更 IPC机制

自智网络简介

俞凡

网络 自智网络

用第一性原理根治数字化转型雾霾:以规则的确定性应对结果的不确定性

王和全

数字化转型 软件开发技术的第一性原理 签约计划第三季

大佬,还记得设计模式的六大设计原则吗?

知识浅谈

设计原则 8月月更

新专利曝光,魅族 19 热帖发布!魅族不断布局出行科技圈

极客天地

再也不敢精通Java了——get/set篇

4ye

Java Jackson lombok 签约计划第三季

Web API的版本控制方案分析_REST_Dilip Krishnan_InfoQ精选文章