JAX-RS入門 十: 兼容與演進

網絡服務會隨着時間的發展再不斷進化,例如:添加新的特性;擴展數據集;數據格式的改變和演化。你怎麼來管理這些變化呢?怎麼讓以前的用戶能夠在舊版本上運行呢?

 

將應用模塊會可以解決這些問題中的大多數。下面就討論一些在開發應用時需要有的設計和決策,以適應這些可能的變化。

 

一、創建新的Media Type

 

REST的一個重要準則是將你的資源的複雜性隱藏在你的變換數據後面。然後URI可以是不變的,但是數據格式會不變演進。需要記住的、非常重要的一點就是當你做計劃時,考慮好你的應用怎麼去應對版本管理。

 

因爲複雜性限制在數據格式中,客戶端可以使用Media type去請求不同的格式版本。一個常用的,致力於解決這個問題的方法就是使用你的應用去定義一個新的Media Type。 一個指導準則就是使用vnd前綴,一個新格式的名字,和一個具體的,以+號分隔的Media Type後綴。假設我們說Red Hat公司有一個管理用戶的特定的xml格式,則Media Type名可能如下:

 

Java代碼  收藏代碼
  1. application/vnd.rht.customers+xml  

vnd表示供應商,rht表示Red Hat,customers代表我們的用戶數據格式。以+xml結尾,讓用戶知道這個數據格式是基於xml的。同樣的對Json:

 

Java代碼  收藏代碼
  1. application/vnd.rht.customers+json  

 

有了一個新的Media Type,下面就是追加版本信息,這樣老的用戶還可以使用老版本的數據:

 

Java代碼  收藏代碼
  1. application/vnd.rht.customers+xml;version=1.0  

 

保持子類型名不變,通過指定一個屬性來指定版本號。這樣隨着時候的推移,只需要提升版本號以表示數據的格式變化。

 

二、靈活的Schema

 

通過在Media Type中使用版本屬性,我們就可以很好的管理和緩解服務或應用的變化。 不過,雖然在Media Type版本信息是相當有用的,但是它不應該是你管理變化的第一選擇。 當定義和初始化一個新的數據格式時,尤其要註釋向前兼容性。

 

例如對於XML Schema,最初的Schema應允許每個Schema類型能夠擴展或自定義新的元素或屬性。例如:

Java代碼  收藏代碼
  1. <schema targetNamespace="http://www.example.org/customer"  
  2. xmlns="http://www.w3.org/2001/XMLSchema">  
  3.     <element name="customer" type="customerType"/>  
  4.     <complexType name="customerType">  
  5.         <attribute name="id" use="required" type="string"/>  
  6.         <anyAttribute/>  
  7.         <element name="first" type="string" minOccurs="1"/>  
  8.         <element name="last" type="string" minOccurs="1"/>  
  9.         <any/>  
  10.     </complexType>  
  11. </schema>  

 

上例中,Schema允許添加任意的屬性和任意的元素。如果新版本的數據類型保留了最初的數據結構,則老版本的客戶端仍然可以驗證和處理他們接收到的新的數據格式。

 

例如以下爲新的Schema,定義了新的屬性和元素,但是必須注意:這些新元素或屬性需要設置爲Optional的

Java代碼  收藏代碼
  1. <schema targetNamespace="http://www.example.org/customer"  
  2. xmlns="http://www.w3.org/2001/XMLSchema">  
  3.     <element name="customer" type="customerType"/>  
  4.     <complexType name="customerType">  
  5.         <attribute name="id" use="required" type="string"/>  
  6.         <anyAttribute/>  
  7.         <element name="first" type="string" minOccurs="1"/>  
  8.         <element name="last" type="string" minOccurs="1"/>  
  9.         <strong><element name="street" type="string" minOccurs="0"/>  
  10.         <element name="city" type="string" minOccurs="0"/>  
  11.         <element name="state" type="string" minOccurs="0"/>  
  12.         <element name="zip" type="string" minOccurs="0"/></strong>  
  13.         <any/>  
  14.     </complexType>  
  15. </schema>  

 

這裏我們新增加了一些元素,並使得他們是可選的。因此舊版本依然可以PUT和POST舊的、仍然有效的數據格式。

 

如果你結合了可擴展的、向前兼容的Schema以及Media Type版本,那你就真正擁有了一個數據格式可升級的系統。版本依賴的客戶可以使用Media Type版本去請求指定的版本數據;未依賴於版本的客戶可以請求和發送他們理解的版本。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章