程序员们对于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. redis pipeline批量处理提高性能

    Redis使用的是客户端-服务器(CS)模型和请求/响应协议的TCP服务器.Redis客户端与Redis服务器之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令.每个请 ...

  2. Java匹马行天下之学编程的起点——编程常识知多少

    学编程的起点——编程常识知多少 前言: 刚去大学那会,我就知道我被录取的学院是软件学院,还知道一点就是软件学院主要是学电脑的,但具体要学什么其实一无所知.待的时间久了,慢慢的,像“编程”.“软件”.“ ...

  3. Python Turtle绘画初学编程——六芒星,浪形圈

    老师上课说可以自学一下python中的绘图turtle,就自己初步学习了一下,做了两个简单的绘图——六芒星和浪形圈(其实我也不知道该叫它什么,就照样子编了个词

  4. C# consume RestApi

    1.RestSharp. Nuget install RestSharp,Newtonsoft.Json. using System; using RestSharp; using Newtonsof ...

  5. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

    Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台-  什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...

  6. FCC---Use CSS Animation to Change the Hover State of a Button---鼠标移过,背景色变色,用0.5s的动画制作

    You can use CSS @keyframes to change the color of a button in its hover state. Here's an example of ...

  7. PeriscopeHeartAnimation

    // // ViewController.m // PeriscopeHeartAnimation // // Created by ldj on 4/28/15. // Copyright (c) ...

  8. Linux中vim编辑命令

    vim 功能 : 一个强大的文本编辑器   语法格式 :vim [ 选项 ] / 路径 / 文本文件名 命令格式: vi [ 选项 ] [ 文件名 ]   +num 打开某个文件直接跳转到 num 行 ...

  9. 【XML】利用Dom4j读取XML文档以及写入XML文档

    Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...

  10. 有趣的bug——Java静态变量的循环依赖

    背景 是的,标题没有错误,不是Spring Bean的循环依赖,而是静态变量之间的循环依赖. 近期的项目均是简单的Maven项目,通过K8S部署在阿里云上,其配置文件读取规则如下所示: (1) 优先读 ...