v1/v2 困境强烈暗示您实际上没有 REST API 可以开始。REST 架构中的对等点通过客户端请求他们理解的媒体类型的表示来交换或多或少的标准化内容。这种技术称为内容类型协商。当然,一个写得不好的服务器可能会忽略建议的媒体类型并发送一个客户端不理解的。但是,这将阻止客户端与服务器进一步交互。因此,表现良好的服务器应该尽可能地尝试为客户端请求提供服务。
根据菲尔丁的说法:
REST API 应该花费几乎所有的描述性工作来定义用于表示资源和驱动应用程序状态的媒体类型,或定义扩展关系名称和/或现有标准媒体类型的超文本启用标记。描述在感兴趣的 URI 上使用哪些方法所花费的任何努力都应该完全在媒体类型的处理规则范围内定义(并且在大多数情况下,已经由现有媒体类型定义)。[这里的失败意味着带外信息正在推动交互而不是超文本。]
来源
媒体类型描述了为这种媒体类型交换的有效负载的语法以及该表示中每个元素所具有的语义。在有意义的链接关系名称和媒体类型的帮助下,服务器可以向客户端介绍下一个可用的选项,客户端可以在完成其任务时使用。即考虑以前的响应包含create
与客户端的链接关系的情况。客户端并不真正知道某些东西必须是什么样子才能被服务器处理,但在调用为create
链接关系名称返回的 URI 时,服务器会以类似形式的表示形式进行响应application/vnd.xyz-form+json
此媒体类型定义了一些输入控件,客户端可以使用这些控件在目标端点上生成服务器期望的请求表示。与 Web 类似,自定义表单还包含 HTTP 操作以及客户端提供的目标 URI,以将响应发送到服务器,最终还包含服务器首选的表示形式。
REST 架构中的客户端不应该关心 URI,因此返回包含v1
or的 URIv2
对他们来说应该或多或少毫无意义。Fielding 甚至表示REST API 本身根本不应该进行版本控制!重要的是客户端和服务器能够理解接收到的有效负载。
实际上需要对描述语法和语义的媒体类型进行版本控制,而不是对 URI 或 API 进行版本控制。即,如果您查看基于浏览器的 Web(REST 的大兄弟),尤其是此处的 HTML,您会注意到它的设计方式要求新版本保持向后兼容。即客户端和服务器接收text/html
定义的有效负载将能够处理纯 HTML (1.0) 到 HTML5 内容,无论使用哪种实际语法(甚至可能是混合语法)。但是,其他媒体类型可能不会那么宽松。如果您认为新旧媒体类型完全不兼容,您可以在这里使用配置文件或注册全新的媒体类型。
无论哪种方式,我希望我能对 REST 架构以及如何实现这一点有更多的了解。我很清楚我的建议可能并不容易实现,尽管一旦你得到它,你基本上将客户端与你的 API 解耦,并让后者自由发展,而不必担心破坏客户端。仍然会有耦合,但客户端和服务器都会耦合到媒体类型,而不是彼此耦合。在创建新的媒体类型之前,可能值得寻找已经存在的媒体类型