一、问题

  软件开发过程中,常常会需要变更以前的接口,添加或删除接口请求字段,接口字段校验、甚至是变更请求/返回字段名称,如果强制要求所有客户端跟着一起升级代价太大。如果接口从一开始就考虑到了版本的设计,那么做到平滑升级就很容易了。

二、版本控制方式

1、利用url传入版本

以@RequestMapping("/api")controller为例:

在路径里传入版本号:

优点:可以做到大版本切换,路由下的所有接口同时更新

缺点:实际中往往不会涉及很多接口同时升级,并且往往难以控制不同接口的版本(版本管理容易混乱)

    /**
* http://localhost:8090/api/v1/getUser/111
* {"userId":111,"userName":"小明"}
*
* @param userId
* @return
*/
@RequestMapping(value = "/v1/getUser/{userId}")
public GetUserV1Response getUserInfoV1(@PathVariable("userId") Integer userId) {
return new GetUserV1Response(userId, "小明");
}

通过参数传入(POST 或 GET)

可以单独控制,注意version不存在和乱传值的处理

    /**
* http://localhost:8090/api/getUser/111?version=v1
* {"userId":111,"userName":"小明"}
* <p>
* http://localhost:8090/api/getUser/111?version=v2
* {"userId":111,"userName":"小明","notes":"version 2"}
*
* @param userId
* @return
*/
@RequestMapping(value = "/getUser/{userId}")
public Object getUserInfo(@PathVariable("userId") Integer userId, @RequestParam("version") String version) {
if ("v1".equals(version)) {
return new GetUserV1Response(userId, "小明");
}
return new GetUserV2Response(userId, "小明", "version 2");
}

2、利用request header

以@RequestMapping("/api2")controller为例:

header设置在Controller或Action上都可以,设置在Controller上,控制所有Action的版本,设置在Action上,单独控制一个Action的版本

@RestController
@RequestMapping(value = "/api2")
public class ApiVersionHeaderDemoController {
@Autowired
private HttpServletRequest request; //request header
@RequestMapping(value = "/getUserById/{userId}", headers = "version=v2")
public Object getUserInfo(@PathVariable("userId") Integer userId) {return new GetUserV2Response(userId, "小明", "version 2");
}
}

对应版本:

不支持的版本:

3、利用content type

利用自定义请求的Content-Type来控制版本:

    /**
* 请求的是 application/vnd.apiversioncontrol.v1+json
* 返回的是 application/json;charset=UTF-8
* v1 是api版本
*
* @param userId
* @return
*/
@RequestMapping(value = "/getUserById/{userId}", consumes = "application/vnd.apiversioncontrol.v1+json")
public Object getUserInfoV11(@PathVariable("userId") Integer userId) {
return new GetUserV2Response(userId, "小明", "version 2");
}

返回的是Content-Type:application/json;charset=UTF-8(不指定produces,默认是application/json;charset=UTF-8)

同时指定request和response的Content-Type为:application/vnd.apiversioncontrol.v2+json

    /**
* 请求、返回Content-Type都是 application/vnd.apiversioncontrol.v1+json
* v1 :为api版本
*
* @param userId
* @return
*/
@RequestMapping(value = "/getUserById/{userId}", consumes = "application/vnd.apiversioncontrol.v2+json", produces = "application/vnd.apiversioncontrol.v2+json")
public Object getUserInfoV12(@PathVariable("userId") Integer userId) {
return new GetUserV2Response(userId, "小明", "version 2");
}

同时指定request和response的Content-Type为:application/vnd.apiversioncontrol+json;version=v2

    /**
* 请求、返回Content-Type都是 application/vnd.apiversioncontrol+json;version=v2
* v2 :为api版本
*
* @param userId
* @return
*/
@RequestMapping(value = "/getUserById/{userId}", consumes = "application/vnd.apiversioncontrol+json;version=v2", produces = "application/vnd.apiversioncontrol+json;version=v2")
public Object getUserInfoV2(@PathVariable("userId") Integer userId) {
return new GetUserV2Response(userId, "小明", "version 2");
}

三、注解实现

注解来实现:SpingMVC框架实现restfull接口的版本控制

参考:webapi-version-control

webapi 版本控制的更多相关文章

  1. ASP.NET Core WebApi版本控制

    前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi ...

  2. 电商系统架构总结4(webapi 版本控制)

    为了 顺利迭代升级,web api 在维护过程是不断升级的,但用户是不能强迫他们每次都跟随你去升级,这样会让用户不胜其烦.为了保证不同版本的客户端能同时兼容,在web api接口上加入版本控制就很有必 ...

  3. Asp.net WebApi版本控制

    有关web api的版本控制网上有很多,如Web API 版本控制的几种方式 Web API 版本化的介绍 但是具体的code并不多,或者说可以run的demo 不多. 版本控制如果项目一开始还好做关 ...

  4. Asp.Net.Core WebApi 版本控制

    前言 在后端Api的开发过程中,无法避免的会遇到接口迭代的过程,如何保证新老接口的共存和接口的向前的兼容呢,这时候就需要对Api进行版本的控制,那如何优雅的控制Api的版本呢? 开始 Microsof ...

  5. Owin WebApi版本控制

    public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey ...

  6. ASP.Net Core WebApi几种版本控制对比

    版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...

  7. WebApi的版本控制

      using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using Sy ...

  8. Net Core WebApi几种版本控制对比

    Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方 ...

  9. .NetCore WebApi —— Swagger版本控制

    目录: .NetCore WebApi——Swagger简单配置 .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger) .NetCore WebApi —— Swagge ...

随机推荐

  1. 40 个顶级 jQuery 图片、内容滑块和幻灯片

    在这个快速发展的网络世界中,我们使用图片.内容滑块和幻灯片来给网站实现良好.有吸引力的外观.你可以吸引浏览者借助图像滑块让网站更加具有活力.使用 JavaScript 可以轻松实现轻量级的图片和内容滑 ...

  2. Codeforces Round #190 (Div. 2).D

    一道贪心题. 可以分两种情况 1 .是没有把对面的牌全打败,那么只要用最大的可能去打攻击状态的牌. 2. 是将对面的牌全打败,那么只要保证打对面防守状态的花费最小,就可以保证最后的结果最大 两种情况下 ...

  3. netty接收大文件的方法

    参考:http://blog.csdn.net/linuu/article/details/51371595 https://www.jianshu.com/p/a0a51fd79f62 netty默 ...

  4. js Tab切换实例

    js 实现 tab 切换 实现如下效果: 1.图片每1秒钟切换1次. 2.当鼠标停留在整个页面上时,图片不进行轮播. 3.当点击切换页的选项上时,出现该选项的对应图片,而且切换页选项的背景颜色发生相应 ...

  5. fieldmeta 基于springboot的字段元数据管理,通用代码生成,快速开发引擎

    fieldmeta: 基于springboot的字段元数据管理 version:Alpha 0.0.1 ,码云地址:https://gitee.com/klguang/fieldmeta 元数据(Me ...

  6. poj3666 Making the grade【线性dp】

    Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:10187   Accepted: 4724 ...

  7. DataSnap服务器生成的ID自动更新到客户端

    很久没有去动Delphi了,突然兴起做个小程序,一个表的ID,在服务器端的应用服务器上生成,如何刷新到客户端? 查看了TDataSetProvider的Options属性,比以前增加了一个poProp ...

  8. JAR包中的MANIFEST.MF文件详解以及编写规范

    参考百度百科的解释如下: http://baike.baidu.com/item/MANIFEST.MF MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据.单词“mani ...

  9. DocumentRoot \

    w  有无\的区别. https://httpd.apache.org/docs/2.4/vhosts/examples.html hosts 127.0.0.1 w.w httpd.conf Ser ...

  10. ansible-puppet-saltstack---ITAMS

    ansible http://www.cnblogs.com/ee900222/p/ansible.html http://ju.outofmemory.cn/entry/67581 http://w ...