webapi 版本控制
一、问题
软件开发过程中,常常会需要变更以前的接口,添加或删除接口请求字段,接口字段校验、甚至是变更请求/返回字段名称,如果强制要求所有客户端跟着一起升级代价太大。如果接口从一开始就考虑到了版本的设计,那么做到平滑升级就很容易了。
二、版本控制方式
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 版本控制的更多相关文章
- ASP.NET Core WebApi版本控制
前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi ...
- 电商系统架构总结4(webapi 版本控制)
为了 顺利迭代升级,web api 在维护过程是不断升级的,但用户是不能强迫他们每次都跟随你去升级,这样会让用户不胜其烦.为了保证不同版本的客户端能同时兼容,在web api接口上加入版本控制就很有必 ...
- Asp.net WebApi版本控制
有关web api的版本控制网上有很多,如Web API 版本控制的几种方式 Web API 版本化的介绍 但是具体的code并不多,或者说可以run的demo 不多. 版本控制如果项目一开始还好做关 ...
- Asp.Net.Core WebApi 版本控制
前言 在后端Api的开发过程中,无法避免的会遇到接口迭代的过程,如何保证新老接口的共存和接口的向前的兼容呢,这时候就需要对Api进行版本的控制,那如何优雅的控制Api的版本呢? 开始 Microsof ...
- Owin WebApi版本控制
public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey ...
- ASP.Net Core WebApi几种版本控制对比
版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...
- WebApi的版本控制
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using Sy ...
- Net Core WebApi几种版本控制对比
Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方 ...
- .NetCore WebApi —— Swagger版本控制
目录: .NetCore WebApi——Swagger简单配置 .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger) .NetCore WebApi —— Swagge ...
随机推荐
- Android无线测试之—UiAutomator UiWatcher API介绍一
UiWatcher类介绍与中断监听检查条件 一.UiWatcher类说明 1.Uiwatcher用于处理脚本执行过程中遇到非预想的步骤 2.UiWatcher使用场景 1)测试过程中来了一个电话 2) ...
- 修改tomcat服务器默认端口号
打开tomcat目录下conf目录下的server.xml,里面会有下面这样一段代码: <Connector port="8080" protocol="HTTP/ ...
- VS2013新特性
大家可能看到我这边颜色和字体和原本不同,这里特意分享给大家背景护眼色值(这对每天看电脑的程序员很重要对不对!)还有字体: 工具-选项-字体和颜色:在项背景点击自定义-色调85 饱和度123 亮度205 ...
- Array.prototype.filter(Boolean)
ES5 中的数组有这个方法:Array.prototype.filter ,具体使用参考MDN,这里讲一个特殊应用: 回顾下语法: new_array = arr.filter(callback[, ...
- Morphia - mongodb之ORM框架
一.简介 二.注解 1.@Entity 2.@Id3.@Indexed4.@Embedded5.@Transient和@Property6.@Reference 三.示例 四.参考资料 Morphia ...
- git学习(6)多人协作
git学习(6)多人协作 当我们从远程仓库克隆的时候,git会自动的把本地的master和远程的master对应起来,并且远程仓库的默认名称是origin 查看远程库的信息 $ git remote ...
- CSDN BI Flume
https://so.csdn.net/so/search/s.do?q=bytebuf&t=%20&u=
- iros2016-Monday 10/10/2016
Workshop Day Integrating Multiple Knowledge Representation and Reasoning Techniques in Robotics (MIR ...
- Python3中json的encode和decode
在Python3中,将对象序列化为JSON对象,即对对象进行json encode编码,使用函数 json.dumps(obj, *, skipkeys=False, ensure_ascii=Tru ...
- 【react表格组件】material-table 基本用法 & 组件override
教程: https://mbrn.github.io/material-table/#/ https://material-ui.com/api/table/ github: https://gith ...
