成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RESTful API如何進行版本控制

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

 [[378299]]

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

您將學(xué)到

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

為什么我們需要對RESTful API進行版本化

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

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

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

最初,你有個這個版本的Student服務(wù),返回數(shù)據(jù)如下:

  1.   "name""Bob Charlie" 

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

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

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

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

接下來讓我們創(chuàng)建一個簡單的SpringBoot的maven項目,并理解對 RESTful 服務(wù)進行版本控制的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> 

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

第一個版本的 Bean

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

第二個版本的 Bean

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

StudentV2使用的Name實體

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

Restful 版本控制的方法

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

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

通過 URI 進行版本控制

  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.  

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

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

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

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

通過請求參數(shù)進行版本控制

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

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

實現(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.     } 

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

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

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

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

通過自定義Header進行版本控制

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

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

實現(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í)行帶有請求頭的Get請求方法。

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

header:X-API-VERSION = 1

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

header:X-API-VERSION = 2

通過媒體類型進行版本控制

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

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

實現(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í)行帶有請求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版本和請求參數(shù)版本控制會污染URI空間。

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

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

是否能在瀏覽器直接執(zhí)行 ? - 如果您有非技術(shù)消費者,那么基于URL的版本將更容易使用,因為它們可以直接在瀏覽器上執(zhí)行。

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

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

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

媒體類型的版本控制

  • Github

自定義Header

  • Microsoft
  • URI路徑

Twitter,百度,知乎

  • 請求參數(shù)控制

Amazon

 

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

2010-06-02 14:16:18

SVN版本控制

2011-07-13 13:13:10

域控制器活動目錄

2010-01-27 10:45:21

C++單例模式

2016-12-30 14:47:21

設(shè)計RESTfulAPI

2010-07-09 13:01:50

SQL Server

2010-03-16 15:50:59

Java遠程控制

2010-02-01 10:21:36

Python編碼轉(zhuǎn)換

2010-02-22 16:05:40

Python配置

2010-06-03 11:01:32

Hadoop安裝部署

2010-09-17 15:36:24

2013-01-28 10:11:24

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

2017-07-28 11:31:59

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

2013-10-17 23:12:12

Windows 8.1Windows 8.1

2009-12-08 11:34:40

WCF Windows

2021-08-26 10:05:31

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

2024-07-08 08:38:37

Python游戲開發(fā)

2010-02-03 13:55:51

Python 代碼

2010-07-22 10:58:49

batch Telne

2011-07-28 14:07:30

2010-09-13 10:45:04

點贊
收藏

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

主站蜘蛛池模板: 国产a视频| 欧美一区二区三区高清视频 | 久草青青草 | jizz视频 | 久久精品色欧美aⅴ一区二区 | 欧美精品一区二区三区四区五区 | 国产精品成av人在线视午夜片 | 欧美高清一区 | 日韩精品极品视频在线观看免费 | 精品国产91乱码一区二区三区 | 99精品国产在热久久 | 欧美精品网 | 色呦呦网站 | 亚洲国产精品视频一区 | 欧美激情一区 | 精品久久久网站 | 九色 在线 | 欧美三区在线观看 | 欧美激情久久久 | 日韩免费视频一区二区 | 国产精品一二区 | 亚洲精品不卡 | 免费观看黄 | 亚洲国产在 | 天天操网| 欧美亚洲另类丝袜综合网动图 | 亚洲精品欧美一区二区三区 | 先锋av资源在线 | 麻豆久久 | 久久久久黄色 | 久草免费在线视频 | 亚洲国产精品成人 | 盗摄精品av一区二区三区 | 国产日产精品一区二区三区四区 | 美女福利视频网站 | 欧美日韩亚洲一区 | 日韩精品免费在线 | 国产精品99久久久久久久久久久久 | xx视频在线观看 | 久久精品视频网站 | 日本久久网站 |