自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

RESTful API如何進(jìn)行版本控制

網(wǎng)絡(luò) 通信技術(shù)
本文將幫助您理解為什么需要版本控制,以及如何對(duì)REST API進(jìn)行版本控制。我們將討論4種版本控制的方法,并比較不同的方法。

 [[378299]]

本文將幫助您理解為什么需要版本控制,以及如何對(duì)REST API進(jìn)行版本控制。我們將討論4種版本控制的方法,并比較不同的方法。

您將學(xué)到

  • 為什么我們需要對(duì)RESTful API 進(jìn)行版本控制?
  • 可用的版本控制有哪些?
  • 如何實(shí)現(xiàn)基于 Restful 的版本控制?

為什么我們需要對(duì)RESTful API進(jìn)行版本化

最好的版本控制方法是不進(jìn)行版本控制。只要不需要版本控制,就不要版本控制。

構(gòu)建向后兼容的服務(wù),以便盡可能避免版本控制!

然而,在許多情況下我們都需要進(jìn)行版本控制,然我們看看下面具體的例子:

最初,你有個(gè)這個(gè)版本的Student服務(wù),返回?cái)?shù)據(jù)如下:

  1.   "name""Bob Charlie" 

后來,您希望將學(xué)生的名字拆分,因此創(chuàng)建了這個(gè)版本的服務(wù)。

  1.   "name": { 
  2.     "firstName""Bob"
  3.     "lastName""Charlie" 
  4.   } 

您可以從同一個(gè)服務(wù)支持這兩個(gè)請(qǐng)求,但是隨著每個(gè)版本的需求多樣化,它會(huì)變得越來越復(fù)雜。

在這種情況下,版本控制就成必不可少,強(qiáng)制性的了。

接下來讓我們創(chuàng)建一個(gè)簡單的SpringBoot的maven項(xiàng)目,并理解對(duì) RESTful 服務(wù)進(jìn)行版本控制的4種不同方法。

  1. <dependencies> 
  2.  <dependency> 
  3.   <groupId>org.springframework.boot</groupId> 
  4.   <artifactId>spring-boot-starter</artifactId> 
  5.  </dependency> 
  6.  
  7.  <dependency> 
  8.   <groupId>org.springframework.boot</groupId> 
  9.   <artifactId>spring-boot-starter-web</artifactId> 
  10.  </dependency> 
  11.  
  12.  <dependency> 
  13.   <groupId>org.projectlombok</groupId> 
  14.   <artifactId>lombok</artifactId> 
  15.  </dependency> 
  16.  
  17.  <dependency> 
  18.   <groupId>org.springframework.boot</groupId> 
  19.   <artifactId>spring-boot-starter-test</artifactId> 
  20.   <scope>test</scope> 
  21.  </dependency> 
  22. </dependencies> 

幾個(gè)用于實(shí)現(xiàn)版本控制的Bean

第一個(gè)版本的 Bean

  1. @Data 
  2. @AllArgsConstructor 
  3. public class StudentV1 { 
  4.     private String name

第二個(gè)版本的 Bean

  1. @Data 
  2. public class StudentV2 { 
  3.     private Name name

StudentV2使用的Name實(shí)體

  1. @Data 
  2. @AllArgsConstructor 
  3. public class Name { 
  4.     private String firstName; 
  5.     private String lastName; 

Restful 版本控制的方法

我們希望創(chuàng)建兩個(gè)版本的服務(wù),一個(gè)返回 StudentV1,另一個(gè)返回 StudentV2。

讓我們來看看創(chuàng)建相同服務(wù)版本的4種不同方法。

通過 URI 進(jìn)行版本控制

  1. @RestController 
  2. public class StudentUriController { 
  3.  
  4.     @GetMapping("v1/student"
  5.     public StudentV1 studentV1() { 
  6.         return new StudentV1("javadaily"); 
  7.     } 
  8.  
  9.     @GetMapping("v2/student"
  10.     public StudentV2 studentV2() { 
  11.         return new StudentV2(new Name("javadaily""JAVA日知錄")); 
  12.     } 
  13.  

請(qǐng)求:http://localhost:8080/v1/student

響應(yīng):{"name":"javadaily"}

請(qǐng)求:http://localhost:8080/v2/student

響應(yīng):{"name":{"firstName":"javadaily","lastName":"JAVA日知錄"}}

通過請(qǐng)求參數(shù)進(jìn)行版本控制

版本控制的第二種方法是使用請(qǐng)求參數(shù)來區(qū)分版本。請(qǐng)求示例如下所示:

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

實(shí)現(xiàn)方式如下:

  1. @RestController 
  2. public class StudentParmController { 
  3.  
  4.     @GetMapping(value="/student/param",params = "version=1"
  5.     public StudentV1 studentV1() { 
  6.         return new StudentV1("javadaily"); 
  7.     } 
  8.  
  9.     @GetMapping(value="/student/param",params = "version=2"
  10.     public StudentV2 studentV2() { 
  11.         return new StudentV2(new Name("javadaily""JAVA日知錄")); 
  12.     } 

請(qǐng)求:http://localhost:8080/student/param?version=1

響應(yīng):{"name":"javadaily"}

請(qǐng)求:http://localhost:8080/student/param?version=2

響應(yīng):{"name":{"firstName":"javadaily","lastName":"JAVA日知錄"}}

通過自定義Header進(jìn)行版本控制

版本控制的第三種方法是使用請(qǐng)求頭來區(qū)分版本,請(qǐng)求示例如下:

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

實(shí)現(xiàn)方式如下所示:

  1. @RestController 
  2. public class StudentHeaderController { 
  3.  
  4.     @GetMapping(value="/student/header",headers = "X-API-VERSION=1"
  5.     public StudentV1 studentV1() { 
  6.         return new StudentV1("javadaily"); 
  7.     } 
  8.  
  9.     @GetMapping(value="/student/header",headers = "X-API-VERSION=2"
  10.     public StudentV2 studentV2() { 
  11.         return new StudentV2(new Name("javadaily""JAVA日知錄")); 
  12.     } 

下圖展示了我們?nèi)绾问褂肞ostman執(zhí)行帶有請(qǐng)求頭的Get請(qǐng)求方法。

請(qǐng)求:http://localhost:8080/student/header

header:X-API-VERSION = 1

請(qǐng)求:http://localhost:8080/student/header

header:X-API-VERSION = 2

通過媒體類型進(jìn)行版本控制

最后一種版本控制方法是在請(qǐng)求中使用Accept Header,請(qǐng)求示例如下:

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

實(shí)現(xiàn)方式如下:

  1. @RestController 
  2. public class StudentProduceController { 
  3.  
  4.     @GetMapping(value="/student/produce",produces = "application/api-v1+json"
  5.     public StudentV1 studentV1() { 
  6.         return new StudentV1("javadaily"); 
  7.     } 
  8.  
  9.     @GetMapping(value="/student/produce",produces = "application/api-v2+json"
  10.     public StudentV2 studentV2() { 
  11.         return new StudentV2(new Name("javadaily""JAVA日知錄")); 
  12.     } 

下圖展示了我們?nèi)绾问褂肞ostman執(zhí)行帶有請(qǐng)求Accept的Get方法。

請(qǐng)求:http://localhost:8080/student/produce

header:Accept = application/api-v1+json

請(qǐng)求:http://localhost:8080/student/produce

header:Accept = application/api-v2+json

影響版本選擇的因素

以下因素影響版本控制的選擇

URI 污染 - URL版本和請(qǐng)求參數(shù)版本控制會(huì)污染URI空間。

濫用請(qǐng)求頭 - Accept 請(qǐng)求頭并不是為版本控制而設(shè)計(jì)的。

緩存 - 如果你使用基于頭的版本控制,我們不能僅僅基于URL緩存,你需要考慮特定的請(qǐng)求頭。

是否能在瀏覽器直接執(zhí)行 ? - 如果您有非技術(shù)消費(fèi)者,那么基于URL的版本將更容易使用,因?yàn)樗鼈兛梢灾苯釉跒g覽器上執(zhí)行。

API文檔 - 如何讓文檔生成理解兩個(gè)不同的url是同一服務(wù)的版本?

事實(shí)上,并沒有完美的版本控制解決方案,你需要根據(jù)項(xiàng)目實(shí)際情況進(jìn)行選擇。

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

媒體類型的版本控制

  • Github

自定義Header

  • Microsoft
  • URI路徑

Twitter,百度,知乎

  • 請(qǐng)求參數(shù)控制

Amazon

 

責(zé)任編輯:武曉燕 來源: JAVA日知錄
相關(guān)推薦

2010-06-02 14:16:18

SVN版本控制

2011-07-13 13:13:10

域控制器活動(dòng)目錄

2010-01-27 10:45:21

C++單例模式

2016-12-30 14:47:21

設(shè)計(jì)RESTfulAPI

2010-07-09 13:01:50

SQL Server

2010-03-16 15:50:59

Java遠(yuǎn)程控制

2013-01-28 10:11:24

敏捷設(shè)計(jì)敏捷開發(fā)

2017-07-28 11:31:59

iOS結(jié)構(gòu)優(yōu)化項(xiàng)目

2009-12-08 11:34:40

WCF Windows

2010-02-01 10:21:36

Python編碼轉(zhuǎn)換

2010-02-22 16:05:40

Python配置

2013-10-17 23:12:12

Windows 8.1Windows 8.1

2021-08-26 10:05:31

APP安全加密網(wǎng)絡(luò)攻擊

2024-07-08 08:38:37

Python游戲開發(fā)

2010-06-03 11:01:32

Hadoop安裝部署

2010-09-17 15:36:24

2023-03-24 16:18:08

微服務(wù)架構(gòu)

2010-02-03 13:55:51

Python 代碼

2010-07-21 14:17:07

Linux telne

2010-09-13 10:45:04

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)