網絡服務會隨着時間的發展再不斷進化,例如:添加新的特性;擴展數據集;數據格式的改變和演化。你怎麼來管理這些變化呢?怎麼讓以前的用戶能夠在舊版本上運行呢?
將應用模塊會可以解決這些問題中的大多數。下面就討論一些在開發應用時需要有的設計和決策,以適應這些可能的變化。
一、創建新的Media Type
REST的一個重要準則是將你的資源的複雜性隱藏在你的變換數據後面。然後URI可以是不變的,但是數據格式會不變演進。需要記住的、非常重要的一點就是當你做計劃時,考慮好你的應用怎麼去應對版本管理。
因爲複雜性限制在數據格式中,客戶端可以使用Media type去請求不同的格式版本。一個常用的,致力於解決這個問題的方法就是使用你的應用去定義一個新的Media Type。 一個指導準則就是使用vnd前綴,一個新格式的名字,和一個具體的,以+號分隔的Media Type後綴。假設我們說Red Hat公司有一個管理用戶的特定的xml格式,則Media Type名可能如下:
- application/vnd.rht.customers+xml
vnd表示供應商,rht表示Red Hat,customers代表我們的用戶數據格式。以+xml結尾,讓用戶知道這個數據格式是基於xml的。同樣的對Json:
- application/vnd.rht.customers+json
有了一個新的Media Type,下面就是追加版本信息,這樣老的用戶還可以使用老版本的數據:
- application/vnd.rht.customers+xml;version=1.0
保持子類型名不變,通過指定一個屬性來指定版本號。這樣隨着時候的推移,只需要提升版本號以表示數據的格式變化。
二、靈活的Schema
通過在Media Type中使用版本屬性,我們就可以很好的管理和緩解服務或應用的變化。 不過,雖然在Media Type版本信息是相當有用的,但是它不應該是你管理變化的第一選擇。 當定義和初始化一個新的數據格式時,尤其要註釋向前兼容性。
例如對於XML Schema,最初的Schema應允許每個Schema類型能夠擴展或自定義新的元素或屬性。例如:
- <schema targetNamespace="http://www.example.org/customer"
- xmlns="http://www.w3.org/2001/XMLSchema">
- <element name="customer" type="customerType"/>
- <complexType name="customerType">
- <attribute name="id" use="required" type="string"/>
- <anyAttribute/>
- <element name="first" type="string" minOccurs="1"/>
- <element name="last" type="string" minOccurs="1"/>
- <any/>
- </complexType>
- </schema>
上例中,Schema允許添加任意的屬性和任意的元素。如果新版本的數據類型保留了最初的數據結構,則老版本的客戶端仍然可以驗證和處理他們接收到的新的數據格式。
例如以下爲新的Schema,定義了新的屬性和元素,但是必須注意:這些新元素或屬性需要設置爲Optional的:
- <schema targetNamespace="http://www.example.org/customer"
- xmlns="http://www.w3.org/2001/XMLSchema">
- <element name="customer" type="customerType"/>
- <complexType name="customerType">
- <attribute name="id" use="required" type="string"/>
- <anyAttribute/>
- <element name="first" type="string" minOccurs="1"/>
- <element name="last" type="string" minOccurs="1"/>
- <strong><element name="street" type="string" minOccurs="0"/>
- <element name="city" type="string" minOccurs="0"/>
- <element name="state" type="string" minOccurs="0"/>
- <element name="zip" type="string" minOccurs="0"/></strong>
- <any/>
- </complexType>
- </schema>
這裏我們新增加了一些元素,並使得他們是可選的。因此舊版本依然可以PUT和POST舊的、仍然有效的數據格式。
如果你結合了可擴展的、向前兼容的Schema以及Media Type版本,那你就真正擁有了一個數據格式可升級的系統。版本依賴的客戶可以使用Media Type版本去請求指定的版本數據;未依賴於版本的客戶可以請求和發送他們理解的版本。