4.16. 允许 Versioning 和 Evolution
4.16. 允许 Versioning 和 Evolution
设计 application protocol 最具挑战性的方面之一, 是确保它能随时间演进, 同时保持与现有 deployment 的兼容性.
使用 HTTP 的 application SHOULD 从一开始就为 extensibility 设计. 这包括:
-
Protocol negotiation: 提供机制, 使 client 和 server 能协商使用哪个 version 或 feature.
-
Graceful degradation: 允许旧 client 与新 server 协作 (反之亦然), 即便它们不支持所有 feature.
-
Feature discovery: 允许 client 发现 server 支持哪些 feature.
-
Ignoring unknown elements: 规定 implementation 应忽略未知 header field, content 或其他 protocol element, 而不是将其视为 error.
versioning 的常见方法包括:
-
Media type versioning: 为不同 version 使用不同 media type (例如
application/vnd.example.v1+json,application/vnd.example.v2+json). -
URL versioning: 在 URL 中包含 version (例如
/v1/resource,/v2/resource). 不过, 这可能产生 caching 和 resource identity 方面的问题. -
Header field versioning: 使用自定义 header field 指示 version.
-
Feature-based negotiation: 允许协商单个 feature, 而不是对整个 protocol 进行 versioning.
application SHOULD:
-
清楚记录 versioning 如何工作.
-
提供如何维护 backward compatibility 的指导.
-
考虑 versioning 对 caching 和其他 HTTP feature 的影响.
-
避免对现有 version 做出 breaking change; 当需要 incompatible change 时, 改为定义新 version.
application SHOULD NOT:
-
使用 URL query parameter 进行 versioning, 因为这可能干扰 caching.
-
造成 protocol 的不同 version 使用相同 identifier (URL, media type) 表示不同事物的情况.
-
在新 version 发布时强制 client 立即升级.