2009-09-09 66 views
8

我正在研究一個企業系統,該系統將在移動客戶端和中央服務器之間使用REST風格的Web服務。儘可能RESTful,讓我們說。REST風格的Web服務:試圖通過自定義XML實現HATEOAS

我的問題涉及HATEOAS(超媒體作爲應用程序狀態的引擎)以及在HTTP響應主體中使用自定義xml。

該系統將永遠永遠公共客戶端使用,但我喜歡的是能夠修改服務器端的資源分配格局的思路HATEOAS後無需重新配置獨立每個客戶端。如果我們決定由於擴展問題,我們需要將服務器功能分散到多個物理盒子中,沒有問題,這將反映在客戶端(或客戶端指令下的服務器)創建新資源時生成的URI中。

我們的業務領域是非常具體和不尋常的。因此,我希望在整個Web服務中爲HTTP響應實體主體使用自定義XML,並且客戶端將從XML中解析資源URI,以便隨時瞭解修改其自身應用程序狀態時可以使用的資源位置。我知道這'打破'了HATEAOS的H部分。

例如當客戶端將事務POST到服務器進行處理時,服務器可能會在201 HTTP響應正文(作爲更大的xml文檔的一部分)中包含以下xml片段。服務器也會通知客戶端URI爲新創建的事務資源本身,但這可能只包含在Location HTTP頭中。

<resulturi>http://resultserver/results/1234.xml</resulturi> 

這是所以壞?使用這項服務的客戶幾乎不可能基於瀏覽器。超媒體在xml中以純文本的形式提供uris的其他優點是什麼?

我想我可以去XHTML,但是我們的移動平臺上的解析器對於POX來說效率更高。

+1

>我知道這'打破'了HATEAOS的H部分。 是嗎?我不知道HATEOAS會對您可以使用的內容類型加以限制。 – trendels 2009-09-09 12:09:05

回答

9

你在resulturi中返回一個url所做的事情已經是超媒體了。唯一的問題是,你需要一個媒體類型,告訴客戶端如何格式化響應,以便它可以以可預測和記錄的方式解析url。

選項1: 創建您自己的媒體類型,如vnd.yourcompany.Resource + xml。通過這樣做,您可以指出媒體類型可以被xml解析器解析,但它遵循由貴公司定義的一些特殊規則。此時,您可以使用任何標準來定義超媒體鏈接(請參閱this問題)。這樣做的一個好處是,如果在6個月內您決定需要對XML格式進行重大更改,則可以創建vnd.yourcompany.ResourceV2 + xml,只要您足夠聰明就可以使用accept-通過讓新客戶端應用程序接受新格式,您可以順暢地將新格式與舊格式並排引入。

選項2: 我對這個選項只有一半認真的看法,但我曾考慮過推出一種名爲application/hyperxml + xml的新媒體類型。該文檔將遵循與application/xml相同的規則,但也會將XLink用於超媒體。這將允許使用javascript的人解析XML文檔,以便以標準方式利用超媒體。

選項3: 使用XHtml。我不明白爲什麼你的解析器遇到了XHTML的問題,但我會盡力說服你的。

2

無論底層標記語言如何,RESTful服務器需要處理請求都需要兩條重要信息:媒體類型和URI。假設給定URI的媒體類型會引入客戶端 - 服務器耦合。例如,它會阻止相同的URI服務於兩種不同類型的媒體。

在設計超媒體格式時,XML不是唯一的選擇。檢查出Sun Cloud API,它定義了一個基於JSON的REST API(雖然它的超鏈接似乎不使用媒體類型)。從這種方法到結合媒體類型與超鏈接的方法並不困難。

例如,您可以定義一個名爲Link的JSON數據結構,如下所示;

{ 
    "name":"human-readable label for link", 
    "uri":"http://example.com/resources/123", 
    "media_type":"application/vnd.com.example.Resource+json" 
} 
2

超媒體不需要HTML甚至完全限定的URI。如果您的媒體類型定義了將響應的某些元素轉換爲不可引用資源的規則,則您使用超媒體。

<result>1234</result> 

上面的例子,並就如何取消引用結果元素的內容是相同的方式超媒體,一個媒體類型的規則相結合:

<result>/foo/1234</result> 

是具有規則預先設置基http URI。所以下面的例子中,http字符串可以忽略的事實可能是隱含的。

<result>http://myserver.com/foo/1234</result> 

然而,雖然他們都是超媒體,並滿足約束條件,我會反對,如果在所有可能的,只是重新使用現有的創建您自己的新超媒體的生產規則和代碼。第一個例子使用戶不那麼明顯,該元素表示超鏈接的資源而不是最後一個例子。

+0

前兩個示例需要客戶端的帶外信息...因此它們不是RESTful。 – HDave 2012-01-09 19:28:41

+0

這就是錨標籤如何在HTML-HREF中工作。媒體特定處理規則允許相關URL。 – 2012-01-21 00:22:55

0

我會建議,而不是手動代碼這些超鏈接,使用工具,爲您創建這些超鏈接。 面向交互的編程是創建這些交互(超鏈接)的好方法。請點擊此鏈接這項技術爲我們工作http://www.masterkube.com/hateoas_technology.html

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – PKirby 2015-07-27 07:39:15

0

在一個非常最低(即使你什麼也不做),你應該把你的網址在XLink屬性,而不是元素含量:

<resulturi xlink:href="http://resultserver/results/1234.xml"/> 

XML處理器能夠解析並按照URI原生地進行處理。作爲一般規則,不可翻譯或不可能具有子元素的文本應該屬於強制執行此類限制的屬性。

但除此之外,請做別人的建議並定義您的媒體類型,以便客戶能夠理解其意義。