程序员们对于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接口仅有自己team或者有限的几个team调用,那么就可以考虑不加版本号,都是自己team的,当你要更新的时候,通知下其他team的人就好,其他team看下你这次更新是否影响,以决定是否调整,以前的代码调用逻辑,这种情况下版本号意义不大,你可以不加;

如果,你开发的restful接口是开放的,你也不知道都有谁调用过,那么这个时候版本号就是必须的了。以百度地图接口为例,百度发布了restful风格的地图接口在网上,全国甚至全世界各行各业都可以调用这些接口,百度要对接口进行升级,该怎么办?如果百度直接在原有的url上进行升级,会产生什么样的结果呢?不可预估。程序员:老板,咱们的产品崩溃了!老板:为啥?程序员:百度升级了接口!哪怕仅仅是多返回了一个字段,都可能导致调用者原有的代码出现问题,毕竟百度无法知道所有人都是怎么解析返回值的。这个时候最好的做法就是加版本号,保持原有版本,发布新的版本,所有问题迎刃而解。老用户也不用因为百度的升级,进行代码的更新,新用户又能享受最新的接口,完美。

总结下,判断是否要加版本号的方法:

1.是否明确的知道都有谁调用了你的接口,并且能通知到,如果能,那可以不加版本号;

2. restful接口升级的时候,原有版本是否保留,如果不保留,可以不加版本号;

如果你还是判读不了,或者不想做判断,那就加上版本号,加上肯定是没有问题的。

当然加版本号也是有技巧的,并不是api/v1/user这样加,这样加肯定是不行的,我们的restful接口多数情况下是包含多个功能模块的,如果其中有一个接口需要升级,而其他接口都不变动,你的url该怎么改呢?api/v2/user?那其他接口呢?还是api/v1/...这就会很混乱,别人调的时候就想怎么又有v1又有v2的,我到底是用v1还是v2?

版本号应该放在一个功能模块的后面,甚至一个url就应该自己独立的版本,如api/user/v2,这样调用者就不会有整套接口都升级到v2的错觉,可能有人会说restful的url是一个资源,这样不太合适,其实你可以理解为用户两个版本的资源嘛,用户资源下的两个不同的版本,由于我这两个user资源同时存在,我当然要标识两个资源的不同,我觉得还能说的通。

我们什么时候发布新版呢?并不是一有什么修改就要算一个版本,我觉得当接口输入输出参数变化时才能算一个新版本
————————————————
版权声明:本文为CSDN博主「椰汁菠萝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/suo082407128/article/details/60132447

Restful服务应不应该在URI中加入版本号的更多相关文章

  1. jersey2.26+spring5+jpa一步步搭建restful服务

    前言 首先,为什么想选择Jersey做restful服务呢?我个人比较喜欢它的插件化设计,可以方便的注入自己的全局处理逻辑.再一个就是可以生成wadl描述文件,供查询服务方法.所以在学习spring的 ...

  2. [JavaEE]Get请求URI中带的中文参数在服务端乱码问题的解决方法

    在Get请求中,如果请求参数中带有中文,如 http://localhost:8080/DinnerParty/shop/search?query=多伦多, 在服务端拿到的是乱码. 这是因为客户端提交 ...

  3. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  4. 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务

    Eureka 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务.由两个组件组成:Eureka服务器和Eureka客户端.Eureka服务器用作服务注册服务器.Eureka ...

  5. RESTful 服务架构风格 * .NET的RESTful框架 OpenRasta

    REST 的约束采用的就是掌控 Web 的基本原则.这些原则是: 用户代理与资源交互,任何可命名和表达的事物都可称为资源.每项资源都有一个唯一的统一资源标识符 (URI). 与资源的交互(通过其唯一的 ...

  6. RESTful服务最佳实践

    本文主要读者 引言 REST是什么 统一接口 基于资源 通过表征来操作资源 自描述的信息 超媒体即应用状态引擎(HATEOAS) 无状态 可缓存 C-S架构 分层系统 按需编码(可选) REST快速提 ...

  7. 我们必须要知道的RESTful服务最佳实践

    看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...

  8. 【msdn】RESTful 服务(配备 WCF)介绍

    原文地址:http://msdn.microsoft.com/zh-cn/magazine/dd315413.aspx RESTful 服务(配备 WCF)介绍 Jon Flanders 代码下载位置 ...

  9. 使用CXF开发RESTFul服务

    相信大家在阅读CXF官方文档(http://cxf.apache.org/docs/index.html)时,总是一知半解.这里向大家推荐一本PacktPub.Apache.CXF.Web.Servi ...

随机推荐

  1. okhttp浅析

    转载自:http://www.ishenping.com/ArtInfo/69561.html 1.okhttp工作的大致流程 1.1.整体流程 (1).当我们通过OkhttpClient创建一个Ca ...

  2. mysqlslap详解--MySQL自带的性能压力测试工具(转)

    本文的参考博客地址为:https://blog.csdn.net/fuzhongfaya/article/details/80943991 和 https://www.cnblogs.com/davy ...

  3. C++ 名字重载、隐藏、覆盖

    名字重载Name overloading 如果顶层函数有不同的签名,则函数名可以相同. 如果同一类中的函数有不同的签名,则函数名可以相同.   C++中允许在相同的作用域内以相同的名字定义几个不同实现 ...

  4. Spring Cloud Alibaba基础教程:Sentinel Dashboard同步Apollo存储规则

    在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...

  5. c# winfrom 更新控件时停止刷新,解决闪烁问题

    static Dictionary<Control, bool> m_lstFreezeControl = new Dictionary<Control, bool>(); / ...

  6. PHP+Ajax点击加载更多列表数据实例

    一款简单实用的PHP+Ajax点击加载更多列表数据实例,实现原理:通过“更多”按钮向服务端发送Ajax请求,PHP根据分页参数查询将最新的几条记录,数据以JSON形式返回,前台Query解析JSON数 ...

  7. ArchLinux 2019.11.01安装流程--安装基本系统

    安装前的一些话 本文是参考官方文档ArchLinux的Installation guide(简体中文)加实际操作编写的. 有啥都好说,转载时请注明作者,这是基本素质,也是法律要求 安装是在虚拟机上进行 ...

  8. PHP mysqli_rollback MySQLi 函数

    定义和用法 mysqli_rollback - 回退当前事务 语法: mysqli_rollback ( mysqli $link ) 参数 参数 必需的 描述 link 是 由mysqli_conn ...

  9. jQuery animate() 方法

    定义和用法 animate() 方法执行 CSS 属性集的自定义动画. 该方法通过 CSS 样式将元素从一个状态改变为另一个状态.CSS属性值是逐渐改变的,这样就可以创建动画效果. 只有数字值可创建动 ...

  10. 通过重复运行的Microsoft Flow由OAuth认证后获取Access Token并将其更新到实体记录

    我是微软Dynamcis 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...