2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

HTTP API 可演进性最佳实践

  • 2012-02-05
  • 本文字数:1830 字

    阅读完需:约 6 分钟

正如标题所示,Benjamin Carlyle 试图在《Best Practices For HTTP API Evolvability》一文中为围绕 HTTP API 构建的系统的设计定义原则和实践,这些系统是可扩展的,并且能一直进化下去。他先指出了 REST(一种架构风格)和 HTTP API(通过 HTTP 暴露的编程接口)之间的区别。

HTTP API 是针对一个特定服务的面向开发者的接口,也被称为 RESTful 服务契约面向资源架构 URI Space

我说 REST 和 HTTP API 紧密相关是因为大多数 HTTP API 并不严格遵守统一接口约束,严格说来统一接口约束要求接口是“标准的”[…]

文章开头他标识出了 API 设计中的不同元素,这些元素决定了 API 后续的进化。通常来说,API 进化涉及到了设计客户端与服务器的兼容性;特别是 API 的向后和向前兼容变更。 变更频率按增序排列依次是:

  1. API 中用到的方法的通用语义,包含异常条件和其他元数据
  2. API 中用到的媒体类型的通用语义,包含全部 Schema 信息
  3. 构成 API 的 URI 集合,包含 API 中用到的每个通用方法和媒体类型的特定语义

API 进化中改变最少的就是方法的语义。文中描述的最佳实践是识别出向前和向后兼容的变化,运用 Postel 法则让服务与客户端以一种更能容忍的方式进行进化。他建议尽可能地使用 HTTP 错误码来传达兼容性问题。

最佳实践 3:新方法名应该选择那些不会和任何已有方法发生向前兼容的名字。例如,如果要处理的方法必须正确理解(必须理解语义)方法的新特性,那么应该选择一个新的方法名。

最佳实践 4:服务应该忽略它们不理解的标头或组件。代理应该不加修改地传递这些标头,或者是无法理解的组件。

[…]

最佳实践 7:在某个数字范围内为新状态分配一个状态码,这个范围可以粗粒度地标识已存在的条件。

[…]

最佳实践 9:如果新状态是一个已知状态(除了 400 Bad Request 或 500 Internal Server Error)的子集,可以向响应头添加信息来细化已知状态的含义,而不是分配一个新的状态码。

他指出了一个重要的区别,即客户端与服务器交互中媒体类型的对称本质。

[…] 与客户端和服务器之间非对称的方法和状态不同,媒体类型通常能用作请求或响应的负载,即适用于两个方向。为此本节中我们不讨论客户端与服务器,而是讲发送端与接收端。

…这构成了与媒体类型相关的最佳实践的基础

[…]

最佳实践 11:只有当验证逻辑是为与文档发送方相同版本或后续版本的 API 编写的情况下,才可能出现不符合最佳实践 10 的文档验证。

最佳实践 12:在不违反媒体类型设计目标的前提下,如果能向现有媒体类型的 Schema 中添加新信息,那么就添加吧。

他提倡使用 Content-Types 和 Accept 标头来管理发送端与接收端之间的兼容性。

HTTP API 习惯于做出向后不兼容的媒体类型 Schema 变更。新客户端请求或者提供了 Schema 中带有向后不兼容变更的新媒体类型。老的客户端继续请求或提供旧的媒体类型。直到所有重要的相关实现都升级到最新的媒体类型集之前,客户端与服务器端都应该要支持旧的媒体类型。

他认为对资源的修改,尤其是 URI 的修改都是服务器应该关心的事;如果客户端是设计成由超媒体约束驱动的话,一般这些修改都不应该引入兼容性问题。他提倡使用 Cookies 将客户端请求路由到合适的服务实例 / 服务器。

在使用多种通用方法时,我们不再处理通用的方法或媒体类型,而是和带有特定语义的特定 URL 打交道。[…] 在考虑如下服务契约时,我倾向于采用以服务器为中心的视角:

  • GET /invoice/{invoice-id},返回媒体类型 application/invoice+xml,内容是 invoice-id 指定的发货单
  • GET /invoice/{invoice-id}/paid,返回媒体类型 text/plain( xsd:bool 语法),内容是 invoice-id 指定的发货单的支付状态
  • PUT /invoice/{invoice-id}/paid,接受媒体类型 text/plain( xsd:bool 语法),设置 invoice-id 指定的发货单的支付状态

此外,他还提出了一些客户端的最佳实践,以便客户端能应对服务器 URI 的转变(transition)和进化。

最佳实践 19:在升级时,服务应该通过 Cookies 追踪哪些客户端应该连接到旧的服务器,哪些应该连接到新的服务器,或者也可以使用类似的机制。

最佳实践 20:即使不是在响应 HEAD 或 GET 请求,客户端也应该遵从服务器发回的重定向状态响应 [说明: RFC2616 ]

最佳实践 21:重新设计 URL 时,确保新的 URL 拥有和旧 URL 一样的语义,并将旧 URL 重定向到新的 URL 上。

本文中提供了一些基本原理,让 HTTP API 系统能随着时间不断进化。请务必阅读 Benjamin Carlyle 的完整原文以便对这一主题能有更深入的理解。

查看英文原文: Best Practices For HTTP API Evolvability

2012-02-05 09:163914
用户头像

发布了 135 篇内容, 共 66.3 次阅读, 收获喜欢 43 次。

关注

评论

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

【技术解决方案】联邦学习中遇到的Non-IID问题——隐语SecretFlow

隐语SecretFlow

联邦学习

AI刷新赛事体验,PAI-ArtLab支撑“我的NBA AI手办”互动

阿里云大数据AI技术

人工智能 阿里云 PAI NBA

融云:用 AI 提升应用活跃度,6 个实用玩法亲测有效

融云 RongCloud

双活中心建设方案

金陵老街

信息安全 双活中心

连锁餐饮拓展微信业务:试错 3 个月,终于找到靠谱方案

微擎应用市场

MyEMS 驱动工业企业能效跃迁:能耗基线动态校准方法论与实证分析

开源能源管理系统

开源 能源管理系统

三面阿里,四面京东,终拿大厂offer!Java还是有机会的!

程序员高级码农

Java 面试

如何基于阿里云 ECS 一键部署 AskTable?实现数据智能洞察

察言观数 AskTable

数据洞察力 智能 BI AskTable 阿里云 ECS AI 问数

veDB-Search:AI 混合检索,懂 SQL 就行

字节跳动数据库

向量数据库 rag 混合搜索 火山引擎数据库 veDB

SaaS 系统越来越多,为什么需要一个 iPaaS 来统一管理?

谷云科技RestCloud

SaaS 数据处理 数据传输 集成平台 ipaas

20个低代码开发平台全景解析与多维对比

优秀

低代码 低代码开发平台 低代码平台

国产算力,正在AI工作站里“生根”

脑极体

AI

蓝图如何落地:零碳园区建设的五步法

西格电力

能源 绿色能源转型 零碳园区 能源可再生 光伏行业发展

运维智能体(SRE Agent)技术分级能力要求

乘云数字DataBuff

可观测 #运维 运维智能体

会议日程新鲜出炉!2025 Altair 数字孪生技术会议火热报名中

Altair RapidMiner

AI 数字孪生 仿真 高性能计算 CAE

企业日志管理终极指南:3步实现自动化收集、低成本存储与智能分析

运维有小邓

实时 Web 日志分析器 日志管理 日志管理工具 #日志分析 日志管理软件

云防护栏理论:应对云配置错误的安全防护策略

qife122

azure 云安全

新型电力系统下 MyEMS 微电网协同调度:实践路径与园区落地案例

开源能源管理系统

开源 能源管理系统

非凸科技受邀出席西部证券2025深圳四季度策略会

非凸科技

数字孪生赋能园区能源数字化:MyEMS 的孪生体建模逻辑与全周期管理实践​

开源能源管理系统

开源 能源管理系统

java操作hbase报错:KeeperErrorCode=NoNode for /hbase-unsecure/master

刘大猫

人工智能 云计算 大数据 算法 物联网

好用!4种真免费的AI接口整理!

王磊

Goroutine间的“灵魂管道”:Channel如何实现数据同步与因果传递?

poemyang

golang 并发编程

组合为什么优于继承:从工程实践到数学本质

canonical

面向对象 组合 可逆计算

Hudi系列:Hudi核心概念之时间轴(TimeLine)

京东科技开发者

活动小程序:数字化活动运营新范式,驱动高效协同与用户参与

深圳亥时科技

ToDesk/向日葵/UU/AnyDesk远程安全与连接能力PK,谁才是真稳如老狗?

小喵子

远程 远程控制 向日葵 ToDesk AnyDesk

体育视频直播全球分发系统

ggscoreLynne

AI前沿|政务大模型部署指引印发、北京市人工智能标委会成立

Fabarta

VMware停服在即,运维焦虑?青云云易捷提供“终身”保障!

智驱前线

HTTP API可演进性最佳实践_REST_Dilip Krishnan_InfoQ精选文章