千家信息网

RESTful API怎么进行版本控制

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"RESTful API怎么进行版本控制",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"RESTful API怎么进行版本控制"吧!您将学到
千家信息网最后更新 2026年11月02日RESTful API怎么进行版本控制

本篇内容主要讲解"RESTful API怎么进行版本控制",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"RESTful API怎么进行版本控制"吧!

您将学到

  • 为什么我们需要对RESTful API 进行版本控制?
  • 可用的版本控制有哪些?
  • 如何实现基于 Restful 的版本控制?

为什么我们需要对RESTful API进行版本化

最好的版本控制方法是不进行版本控制。只要不需要版本控制,就不要版本控制。

构建向后兼容的服务,以便尽可能避免版本控制!

然而,在许多情况下我们都需要进行版本控制,然我们看看下面具体的例子:

最初,你有个这个版本的Student服务,返回数据如下:

{
"name": "Bob Charlie"
}

后来,您希望将学生的名字拆分,因此创建了这个版本的服务。

{
"name": {
"firstName": "Bob",
"lastName": "Charlie"
}
}

您可以从同一个服务支持这两个请求,但是随着每个版本的需求多样化,它会变得越来越复杂。

在这种情况下,版本控制就成必不可少,强制性的了。

接下来让我们创建一个简单的SpringBoot的maven项目,并理解对 RESTful 服务进行版本控制的4种不同方法。



org.springframework.boot
spring-boot-starter



org.springframework.boot
spring-boot-starter-web



org.projectlombok
lombok



org.springframework.boot
spring-boot-starter-test
test

几个用于实现版本控制的Bean

第一个版本的 Bean

@Data
@AllArgsConstructor
public class StudentV1 {
private String name;
}

第二个版本的 Bean

@Data
public class StudentV2 {
private Name name;
}

StudentV2使用的Name实体

@Data
@AllArgsConstructor
public class Name {
private String firstName;
private String lastName;
}

Restful 版本控制的方法

我们希望创建两个版本的服务,一个返回 StudentV1,另一个返回 StudentV2。

让我们来看看创建相同服务版本的4种不同方法。

通过 URI 进行版本控制

@RestController
public class StudentUriController {

@GetMapping("v1/student")
public StudentV1 studentV1() {
return new StudentV1("javadaily");
}

@GetMapping("v2/student")
public StudentV2 studentV2() {
return new StudentV2(new Name("javadaily", "JAVA日知录"));
}

}

请求:http://localhost:8080/v1/student

响应:{"name":"javadaily"}

请求:http://localhost:8080/v2/student

响应:{"name":{"firstName":"javadaily","lastName":"JAVA日知录"}}

通过请求参数进行版本控制

版本控制的第二种方法是使用请求参数来区分版本。请求示例如下所示:

  • http://localhost:8080/student/param?version=1
  • http://localhost:8080/student/param?version=2

实现方式如下:

@RestController
public class StudentParmController {

@GetMapping(value="/student/param",params = "version=1")
public StudentV1 studentV1() {
return new StudentV1("javadaily");
}

@GetMapping(value="/student/param",params = "version=2")
public StudentV2 studentV2() {
return new StudentV2(new Name("javadaily", "JAVA日知录"));
}
}

请求:http://localhost:8080/student/param?version=1

响应:{"name":"javadaily"}

请求:http://localhost:8080/student/param?version=2

响应:{"name":{"firstName":"javadaily","lastName":"JAVA日知录"}}

通过自定义Header进行版本控制

版本控制的第三种方法是使用请求头来区分版本,请求示例如下:

  • http://localhost:8080/student/header

    • headers=[X-API-VERSION=1]
  • http://localhost:8080/student/header

    • headers=[X-API-VERSION=2]

实现方式如下所示:

@RestController
public class StudentHeaderController {

@GetMapping(value="/student/header",headers = "X-API-VERSION=1")
public StudentV1 studentV1() {
return new StudentV1("javadaily");
}

@GetMapping(value="/student/header",headers = "X-API-VERSION=2")
public StudentV2 studentV2() {
return new StudentV2(new Name("javadaily", "JAVA日知录"));
}
}

下图展示了我们如何使用Postman执行带有请求头的Get请求方法。

请求:http://localhost:8080/student/header
header:X-API-VERSION = 1

请求:http://localhost:8080/student/header
header:X-API-VERSION = 2

通过媒体类型进行版本控制

最后一种版本控制方法是在请求中使用Accept Header,请求示例如下:

  • http://localhost:8080/student/produce

    • headers=[Accept=application/api-v1+json]
  • http://localhost:8080/student/produce

    • headers=[Accept=application/api-v2+json]

实现方式如下:

@RestController
public class StudentProduceController {

@GetMapping(value="/student/produce",produces = "application/api-v1+json")
public StudentV1 studentV1() {
return new StudentV1("javadaily");
}

@GetMapping(value="/student/produce",produces = "application/api-v2+json")
public StudentV2 studentV2() {
return new StudentV2(new Name("javadaily", "JAVA日知录"));
}
}

下图展示了我们如何使用Postman执行带有请求Accept的Get方法。

请求:http://localhost:8080/student/produce
header:Accept = application/api-v1+json

请求:http://localhost:8080/student/produce
header:Accept = application/api-v2+json

影响版本选择的因素

以下因素影响版本控制的选择

  • URI 污染 - URL版本和请求参数版本控制会污染URI空间。
  • 滥用请求头 - Accept 请求头并不是为版本控制而设计的。
  • 缓存 - 如果你使用基于头的版本控制,我们不能仅仅基于URL缓存,你需要考虑特定的请求头。
  • 是否能在浏览器直接执行 ? - 如果您有非技术消费者,那么基于URL的版本将更容易使用,因为它们可以直接在浏览器上执行。
  • API文档 - 如何让文档生成理解两个不同的url是同一服务的版本?
事实上,并没有完美的版本控制解决方案,你需要根据项目实际情况进行选择。

到此,相信大家对"RESTful API怎么进行版本控制"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

版本 控制 方法 服务 不同 两个 参数 情况 方式 示例 选择 下图 内容 因素 实际 文档 浏览器 缓存 项目 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 互联网属科技 中资互联网科技 华中科技大学互联网 未来的互联网科技 奇酷互联网络科技公司 科技类的互联网平台 互联网时代科技改变生活 苏州五指互联网络科技有限 消费医药和互联网科技 互联网新科技动漫ppt素材 山东星卡互联网科技有限公司官网 黑云互联网科技有限公司 领航科技大厦互联网公司 工业互联网科技成果转化 半导体行业属于互联网高科技类吗 互联网科技平台产品运营 互联网科技的前景 第三届互联网大会安防黑科技 现代互联网科技公司 深圳市人人互联网科技有限公司 互联网科技工作委员会主任 科技互联网企业 北京互联网络科技有限公司 顺玮阁互联网科技 常德市电业局互联网科技部 金融科技与互联网金融相同和不同 南山科技园互联网公司有哪些 晓花互联网科技有限公司网址 西安有哪些互联网高科技企业
0