Restful服务应不应该在URI中加入版本号?

作者: JerryHouse 分类: java 发布时间: 2015-06-15 16:53 ė 6Restful服务应不应该在URI中加入版本号?已关闭评论

我维护着向我的APP提的Restful服务,在Restful服务中每一个URI就对应着一个独立的资源,例如http://api.myapp.com/user/1就对应着编号为1的用户的信息,发出请求后客户端会得到描述用户信息的json串:

{
id: 1,
username: "13636501595",
password: "123",
lastLng: 114.158,
lastLat: 22.2847,
addTime: "2015-01-10 15:22:47",
updateTime: "2015-01-10 15:45:53",
}

最近由于业务需要我需要在用户信息中加入手机信息,在设计时我考虑了两种实现方式:1)URI不变,直接在原有的用户信息中加入手机信息。2)在URI中加入版本信息,http://api.myapp.com/v2/user/1请求的用户信息中包含手机信息,而http://api.myapp.com/user/1得到的信息保持不变。

豆瓣使用的是2中的方法,例如新版的豆瓣API请求书本信息的URI是http://api.douban.com/v2/book/isbn/9787544274692,其中v2就是版本号,而我个人觉得对于用户友好的服务应该屏蔽版本的细节,带着这个问题我查阅了一下国外的开发者的观点。
程序员们对于Restful服务应不应该在URI中加入版本信息的问题在stackoverflow上进行了积极的讨论:Best practices for API versioning,该问题被赞了720次–很少有被赞这么多次的问题。
支持在URI中加入版本信息的一方认为
1. 保持接口的向后兼容是一件十分困难或者说费精力的事情,而在URI中加入版本信息则避免了向后兼容,另外通过过期提示,重定向,文档等手段也能降低用户迁移到新的接口上的成本。
反对在URI中加入版本信息的一方认为
1. 不同API版本支持的资源类型是不一样的,当用户从一个版本切换到另外一个版本时原有的代码很有可能不能正常工作,这无疑加大了用户迁移的成本。
2. Restful服务中的URI对应着相应的资源,用户在请求某个URL时他们期望得到的是某个资源,而版本和资源的概念没有任何关系,因此在URI中加入版本会让用户混淆。(另外版本也不应用来指定资源的表现形式,例如json,xml)
3. 版本的加入会让整个Restful服务变得混乱,除非重写整个服务,否则你就会经常碰到这样的情况:一些低版本的资源指向了一些高版本的资源,如果不修改前者,那么很可能新的客户端代码会出错,如果修改前者,很可能旧的客户端代码会出错。
综上所述,我觉得Restful服务不应该在URI中加入版本信息,因为Restful服务的变迁后让原有的业务正常工作肯定是需要工作量,关键在于这个工作量由谁来承担。如果由服务提供者承担,那么他们需要保证接口的向后兼容性,而不是随意改变URI;如果由服务的用户承担,那么他们需要迁移代码以适应新的接口。作为服务提供者,服务就像自己的产品,当然应该是自己多做些,客户少做些来的好!

本文出自 dcharm,转载时请注明出处及相应链接。

本文永久链接: http://www.dcharm.com/?p=363

Ɣ回顶部