如何对公共Web API进行版本管理?
摘要
关于API版本管理实践的讨论,质疑将URL路径(例如/v1/)与语义化版本控制耦合的做法,并探讨潜在的反模式。
<p>通常存在一个名为“Product API”之类的现有API。它的路径中通常也包含/api/v1。</p>
<p>对我来说,这通常感觉像是一种反模式,尤其是当API本身使用语义化版本控制时:将路由与API契约混在一起。</p>
<p>在URL中包含/v1/的同时还有主版本号.次版本号.修订号的版本号:将语义化版本的第一个数字与URL路径耦合对我来说感觉不直观,如果你做出不兼容的更改,你可能需要新的路径和新的反向代理路由等等,并且你还将API契约分散到两个地方:URL和版本号。</p>
<p>如果你同时开始构建一个全新的“Product API”的继任者,那么旧API实际上就会卡在“v1”上,即使它本身也有不兼容的更改。</p>
<p>你怎么看?</p>
<p>你有没有任何关于API设计的小烦恼或意见想要分享?</p>
<p>抱歉,这可能是令人困惑的头脑风暴文本,非常想听听大家的意见。</p>
<p>谢谢</p>
查看缓存全文
缓存时间: 2026/05/29 05:52
# 如何对公共 Web API 进行版本控制?
来源:https://lobste.rs/s/g9u6b7/how_do_you_version_public_web_apis
通常存在一个名为“Product API”之类的现有 API。它往往也在路径中包含 `/api/v1`。
对我来说,这常常感觉像是一种反模式,尤其是当 API 本身使用语义化版本控制时:将路由与 API 契约混为一谈。
在 URL 中包含 `/v1/`,同时又有一个 `major.minor.patch` 版本:将语义化版本的第一个数字与 URL 路径耦合,这让我觉得有违直觉。如果你做出破坏性变更,你可能需要新的路径和新的反向代理路由等,而且你还会将 API 契约分散到两个地方:URL 和版本号。
如果你同时开始构建“Product API”的全新后继版本,旧 API 实际上就被困在“v1”上了,即使它自身也有破坏性变更。
你怎么看?
你有什么 API 设计上的“雷点”或见解想分享吗?
抱歉这篇混乱的脑洞碎片,很期待听听大家的看法。
谢谢
相似文章
古怪的API能告诉我们关于网络的什么?
本文探讨了像canPlayType和History.pushState这类古怪的浏览器API,讨论了它们不寻常的设计决策和历史原因。
为何不根据链接的SDK来改变API行为?
本文以Windows的CoInitializeSecurity为例,探讨了根据链接的SDK版本改变API行为的陷阱。讨论了DLL版本不匹配和尾调用优化等问题使这种方法复杂化。
既然AI智能体可以直接抓取网站或Swagger文档,MCP还有意义吗?
探讨当AI智能体越来越多地直接抓取网站或Swagger/OpenAPI文档时,模型上下文协议(MCP)是否仍然重要,并比较两种方法的可靠性和优势。
多提供商LLM API兼容性笔记:我们尝试的三种方法
工程笔记,比较了将多个LLM提供商(OpenAI、Anthropic、Google)的访问统一到单个内部接口的三种方法,讨论了API标准化、原生SDK使用和网关模式的权衡。
API泛滥及其在AI社交媒体中的走向
本文揭示了主要平台(如X、Reddit和Stack Overflow)免费利用用户生成内容训练AI模型,随后对访问相同数据收取高昂API费用,并封禁抗议或删除自身内容的用户的模式。