RESTful API如何进行版本控制

简介: 本文将帮助您理解为什么需要版本控制,以及如何对REST API进行版本控制。我们将讨论4种版本控制的方法,并比较不同的方法。

您将学到


  • 为什么我们需要对RESTful API 进行版本控制?


  • 可用的版本控制有哪些?


  • 如何实现基于 Restful 的版本控制?


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


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


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


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


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


{
"name": "Bob Charlie"}


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


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


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


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


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


<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>


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


第一个版本的 Bean


@Data@AllArgsConstructorpublicclassStudentV1 {
privateStringname;
}


第二个版本的 Bean


@DatapublicclassStudentV2 {
privateNamename;
}


StudentV2使用的Name实体


@Data@AllArgsConstructorpublicclassName {
privateStringfirstName;
privateStringlastName;
}


Restful 版本控制的方法


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


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


通过 URI 进行版本控制


@RestControllerpublicclassStudentUriController {
@GetMapping("v1/student")
publicStudentV1studentV1() {
returnnewStudentV1("javadaily");
    }
@GetMapping("v2/student")
publicStudentV2studentV2() {
returnnewStudentV2(newName("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


实现方式如下:

@RestControllerpublicclassStudentParmController {
@GetMapping(value="/student/param",params="version=1")
publicStudentV1studentV1() {
returnnewStudentV1("javadaily");
    }
@GetMapping(value="/student/param",params="version=2")
publicStudentV2studentV2() {
returnnewStudentV2(newName("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]


实现方式如下所示:


@RestControllerpublicclassStudentHeaderController {
@GetMapping(value="/student/header",headers="X-API-VERSION=1")
publicStudentV1studentV1() {
returnnewStudentV1("javadaily");
    }
@GetMapping(value="/student/header",headers="X-API-VERSION=2")
publicStudentV2studentV2() {
returnnewStudentV2(newName("javadaily", "JAVA日知录"));
    }
}


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


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

header:X-API-VERSION = 1


1.png


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

header:X-API-VERSION = 2


2.png

 

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


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


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


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


实现方式如下:


@RestControllerpublicclassStudentProduceController {
@GetMapping(value="/student/produce",produces="application/api-v1+json")
publicStudentV1studentV1() {
returnnewStudentV1("javadaily");
    }
@GetMapping(value="/student/produce",produces="application/api-v2+json")
publicStudentV2studentV2() {
returnnewStudentV2(newName("javadaily", "JAVA日知录"));
    }
}


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


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

header:Accept = application/api-v1+json


3.png


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

header:Accept = application/api-v2+json


4.png

 

影响版本选择的因素

 

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


  • URI 污染 - URL版本和请求参数版本控制会污染URI空间。


  • 滥用请求头 - Accept 请求头并不是为版本控制而设计的。


  • 缓存 - 如果你使用基于头的版本控制,我们不能仅仅基于URL缓存,你需要考虑特定的请求头。


  • 是否能在浏览器直接执行 ? - 如果您有非技术消费者,那么基于URL的版本将更容易使用,因为它们可以直接在浏览器上执行。


  • API文档 - 如何让文档生成理解两个不同的url是同一服务的版本?


事实上,并没有完美的版本控制解决方案,你需要根据项目实际情况进行选择。


下面列表展示了主要API提供商使用的不同版本控制方法:


  • 媒体类型的版本控制
  • Github


  • 自定义Header
  • Microsoft


  • URI路径
  • Twitter,百度,知乎


  • 请求参数控制
  • Amazon


以上,希望对你有所帮助!

目录
相关文章
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
26 0
|
11天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
14天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。
|
23天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
27天前
|
XML JSON 安全
谈谈你对RESTful API设计的理解和实践。
RESTful API是基于HTTP协议的接口设计,通过URI标识资源,利用GET、POST、PUT、DELETE等方法操作资源。设计注重无状态、一致性、分层、错误处理、版本控制、文档、安全和测试,确保易用、可扩展和安全。例如,`/users/{id}`用于用户管理,使用JSON或XML交换数据,提升系统互操作性和可维护性。
18 4
|
29天前
|
安全 API 开发者
构建高效可扩展的RESTful API服务
在数字化转型的浪潮中,构建一个高效、可扩展且易于维护的后端API服务是企业竞争力的关键。本文将深入探讨如何利用现代后端技术栈实现RESTful API服务的优化,包括代码结构设计、性能调优、安全性强化以及微服务架构的应用。我们将通过实践案例分析,揭示后端开发的最佳实践,帮助开发者提升系统的响应速度和处理能力,同时确保服务的高可用性和安全。
30 3
|
1月前
|
缓存 前端开发 API
构建高效可扩展的RESTful API:后端开发的最佳实践
【2月更文挑战第30天】 在现代Web应用和服务端架构中,RESTful API已成为连接前端与后端、实现服务间通信的重要接口。本文将探讨构建一个高效且可扩展的RESTful API的关键步骤和最佳实践,包括设计原则、性能优化、安全性考虑以及错误处理机制。通过这些实践,开发者可以确保API的健壮性、易用性和未来的可维护性。
|
1月前
|
API 开发者 UED
深入探讨RESTful API设计原则及最佳实践
在当今互联网时代,RESTful API已成为各种软件系统之间进行通信的重要方式。本文将从资源定义、URI设计、HTTP方法选择、状态码规范等方面深入探讨RESTful API设计的原则与最佳实践,帮助开发者更好地构建高效、健壮的API。
|
1月前
|
JSON Java API
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
23 1
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务