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天前
|
SQL 缓存 测试技术
构建高性能RESTful API:最佳实践与避坑指南###
—— 本文深入探讨了构建高性能RESTful API的关键技术要点,从设计原则、状态码使用、版本控制到安全性考虑,旨在为开发者提供一套全面的最佳实践框架。通过避免常见的设计陷阱,本文将指导你如何优化API性能,提升用户体验,确保系统的稳定性和可扩展性。 ###
23 9
|
2天前
|
JSON 缓存 API
构建高效RESTful API的最佳实践
【10月更文挑战第34天】在数字时代的浪潮中,后端开发扮演着至关重要的角色。本文将带你深入探索如何构建高效的RESTful API,从设计原则到实际编码技巧,再到性能优化和错误处理,我们将一一解锁这些技能。你将学会如何打造一个既优雅又强大的后端服务,让你的应用程序在激烈的市场竞争中脱颖而出。那么,让我们一起踏上这段精彩的旅程吧!
12 2
|
3天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
随着互联网技术的发展,前后端分离成为Web开发的主流模式。本文介绍RESTful API的基本概念、设计原则及在PHP中的实现方法。RESTful API是一种轻量级、无状态的接口设计风格,通过HTTP方法(GET、POST、PUT、DELETE)操作资源,使用JSON或XML格式传输数据。在PHP中,通过定义路由、创建控制器、处理HTTP请求和响应等步骤实现RESTful API,并强调了安全性的重要性。
11 2
|
5天前
|
存储 安全 API
深入理解RESTful API设计原则
本文旨在探讨RESTful API设计的基本原则和最佳实践,帮助开发者构建高效、可维护的Web服务。通过分析REST架构的核心概念,如资源、统一接口、无状态通信等,本文将指导读者如何设计符合REST原则的API,以及如何处理常见的设计挑战,如版本控制、错误处理和安全性问题。
|
8天前
|
存储 缓存 API
深入理解RESTful API设计原则
【10月更文挑战第28天】 在现代软件开发中,RESTful API已经成为了前后端分离架构下不可或缺的一部分。本文将探讨RESTful API的核心设计原则,包括资源导向、无状态性、统一的接口以及可缓存性等关键概念,并通过实例解析如何在实际应用中遵循这些原则来设计高效、可扩展的API。我们将深入了解REST架构风格的理论基础,并讨论其对提升系统互操作性和简化客户端实现的重要性。
40 3
|
8天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
28 3
|
10天前
|
前端开发 关系型数据库 API
深入浅出后端开发——从零到一构建RESTful API
本文旨在为初学者提供一个关于后端开发的全面指南,特别是如何从零开始构建一个RESTful API。我们将探讨后端开发的基本概念、所需技术栈、以及通过实际案例展示如何设计和实现一个简单的RESTful API。无论你是完全的新手还是有一定编程基础的开发者,这篇文章都将为你提供实用的知识和技巧,帮助你在后端开发的道路上迈出坚实的一步。
|
10天前
|
XML API 网络架构
深入理解RESTful API设计原则与实践
【10月更文挑战第26天】在数字化浪潮中,API(应用程序编程接口)成为连接不同软件组件的桥梁。本文将深入浅出地探讨如何根据REST(Representational State Transfer)原则设计高效、易于维护和扩展的API,同时分享一些实用的代码示例,帮助开发者构建更加健壮和用户友好的服务。
|
10天前
|
监控 测试技术 API
确保微服务的API版本控制策略能够适应不断变化的业务需求
确保微服务的API版本控制策略能够适应不断变化的业务需求
|
11天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
23 2
下一篇
无影云桌面