程序员们对于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. 【centOS】centOS7 下载

    地址:http://mirrors.aliyun.com/centos/ 进入国内的阿里云的,这里CentOS 7提供了三种ISO镜像文件的下载:DVD ISO.Everything ISO.Mini ...

  2. C# 同步转异步 AutoResetEvent

    当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画.下载进度等) 而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B. AutoResetEvent 同步转异步 ...

  3. java基础(10):继承、抽象类

    1. 继承 1.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系.例如公司中的研发部员工和维护部员工 ...

  4. [转]Doing more with Outlook filter and SQL DASL syntax

    本文转自:https://blogs.msdn.microsoft.com/andrewdelin/2005/05/10/doing-more-with-outlook-filter-and-sql- ...

  5. Android 网络加载通用Loading

    为了用户体验用好,App在网络请求时通常都会显示个进度显示圈圈,提示用户耐心等待,最脍炙人口的莫过于登录啦. 接下来我们就通过Dialog来实现,然后在BaseActivity,BaseFragmen ...

  6. Python使用APScheduler实现定时任务

    APScheduler是基于Quartz的一个Python定时任务框架.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.在线文档:https://apscheduler. ...

  7. [b0040] python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore

    # -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore 逻辑: 启动5个进程,打印,每个各自睡 ...

  8. typora使用说明

    一级标题 # 空格 编写内容 二级标题 ## 空格 编写内容 有序内容 1.+Tab 无序内容 -+Tab 代码块 print("hello wrold") typora快捷键 c ...

  9. axios如何先请求A接口然后在请求B接口

    总结:在第一个then的请求结束后,在添加一个then,表示请求第二个接口,在第二个then里面写第二个接口的请求方式 axios.get("./a.json").then(res ...

  10. word最近文档清除