REST筆記(二):有CRUD與URI的服務就是RESTful Service嗎?
網上有許多介紹REST的資料,在這大部分資料中,基本都會介紹通過URI隧道技術與通用的連接器接口(也就是POST\GET\PUT\DELETE,即CRUD)對資源進行操作。
那么支持URI隧道技術與CRUD的服務就表明我們的服務就是REST風格的了嗎。?事實上在Richardson成熟度模型中,URI隧道技術與HTTP出于第一級與第二級。如下圖:

在他的最上層就是本節所敘述的超媒體(HyperMedia)。
本節目錄:
- 1、超媒體格式
- 2、超媒體格式與POX比較
- 3、如何處理超媒體
- 4、標準超媒體格式
在REST中有一個很重要的約束,即統一接口。尤其是在接口制約在資源上的操作方法上。但是統一接口還有一個很重要的方面:超媒體即引用狀態引擎(Hypermedia As The Engine Of Application State,縮寫為HATEOAS)。通常將固定、統一的URI暴露出來,之后的應用便由超媒體接管。
那么什么是超媒體呢。?其實我們每天都會接觸到超媒體。比如:HTML,這就是廣泛使用的超媒體格式之一。它根本的特征是:消費者經過資源表述中的鏈接來改變應用的狀態。這也是本人了解REST("表述性狀態轉移")中狀態的轉移方式。服務通過統一的URI將接口公開,消費者通過此接口獲取到資源的表述,然后消費者通過表述之間的鏈接來完成某個目標。比如說:網購。它先引導消費者搜索希望購買的商品→然后展現資源→付款→完成交易。
1、超媒體格式。
REST的超媒體格式沒有指定具體的表述格式,但是要求格式必須提供必要的超媒體信息。由超媒體驅動的分布式系統對其消費者提出的要求是消費者必須發現資源并與之進行交互從而完成應用的目標。超媒體的格式有很多:
- 1.1標準的超媒體格式XHTML,Atom
- 1.2自定義的超媒體格式。只要消費者與服務提供者之間建立契約,使消費者能正確處理服務所提供的資源。
2、超媒體格式與POX之間的比較
普通老式XML(Plain Old XML)是一種廣泛使用的標準,并且具有平臺無關性。標準的超媒體格式如Atom、XHTML也是一種XML的格式。那么他們之間有什么差別呢。?為什么超媒體格式稱為REST的核心原則而非POX?這就要響應與表述說起。
舉例說明:消費者提交一個訂單信息的表述,使用Fiddler獲取到POX風格響應如下:

上面這個響應很正常,沒有什么問題。當我們提交了一個資源給服務后,服務也返回了Location信息,即Location: Order/1。我們可以功過它來獲取提交資源的表述。
如果使用超媒體格式,我們得到的響應如下:

表述中<link>的說明:
uri屬性:它的值表明消費者想要推進應用協議時可以與之交互的資源
rel屬性:表明跟隨鏈接與資源交互時采用的HTTP動作
mediaType屬性:表明請求荷載的媒體類型。
上面兩種HTTP響應中,POX格式只是給出了消費者提交資源的表述,而超媒體格式卻給出了很多鏈接值來對資源進行廣告。通過超媒體的方式,我們將連接直接放置在了發回給消費者的響應中,通過它可以引導消費者進行下一步操作,從而完成最終目標。這樣,相比暴露給固定的URI更明智。因為它進一步降低了消費者與服務端的耦合。而在用戶通過不同的鏈接來獲取資源進行操作時,應用的狀態也隨之發生著變化。個人覺得這就是REST中核心思想。
附加說明:
媒體類型、鏈接關系值、HTTP慣用語是領域應用協議(DAP Domain Application Protocol)三個要素。
1、媒體類型規范性的描述了表述格式的綱要、處理模型、和鏈接關系值
2、鏈接關系值:描述鏈接資源的作用
3、HTTP慣用語:操作參與協議的資源。HTTP慣用語包括方法、HTTP頭信息、HTTP狀態碼.
3、如何處理超媒體格式
看了上面的介紹,是否覺得超媒體具有眾多的優勢?那像這種媒體格式,應該如何處理它呢。?其實答案在HTTP給出的響應中已經給出了答案。
看看Content-Type的值,我們就知道如何處理了。在HTTP中忽略Content-Type它的值是一種及其不明智的做法。也許有人會說,像上面自定義的超媒體格式application/vnd.example+xml,不就是一個XML嗎。?為什么不能用解析常規XML文檔來對他進行操作呢。?是的,如果將超媒體格式作為一種POX格式來進行操作,那就浪費了資源了。還有人或許會說,上面的格式也沒有一種統一的標準來對表述進行操作。也是。因為它是我們自己定義的一種超媒體格式,既然是我們自己定義的,那么它就一定只屬于我們當前應用的范圍,超出這一范圍了,也就失去了它原本的意義。實際應用中,我們也用標準的超媒體格式,來供我們使用。
4、標準的超媒體格式介紹
前面已經介紹了幾種常見的超媒體格式,如XHTML、ATOM。Apache Abdera和.Net FrameWork中的syndication類型都實現了Atom Syndicaiton Format。
浙公網安備 33010602011771號