簡體   English   中英

RESTful Web服務:嘗試使用自定義XML實現HATEOAS

[英]RESTful web services: trying to achieve HATEOAS with custom XML

我正在開發一個企業系統,它將在移動客戶端和中央服務器之間使用RESTful Web服務。 盡可能使用RESTful,讓我們說。

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

該系統永遠不會被公共客戶端使用,但我喜歡HATEOAS的想法,即能夠在以后修改服務器端資源分配模式,而無需獨立地重新配置每個客戶端。 如果我們決定由於擴展問題我們需要在多個物理盒上擴展服務器功能,沒問題,這將反映在客戶端(或來自客戶端的指令下的服務器)創建新資源時生成的URI中。

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

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

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

糟糕嗎? 使用此服務的客戶端幾乎不可能基於瀏覽器。 超媒體在xml中以純文本形式提供uris的其他優點是什么?

我想我可以去XHTML,但我們的移動平台上的解析器使用POX更有效率。

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

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

選項2:我對這個選項只有一半認真,但我考慮過推動一種名為application / hyperxml + xml的新的mediatype。 該文檔將遵循與application / xml相同的規則,但也會使用XLink進行超媒體。 這將允許使用javascript解析XML文檔的人也以標准化方式利用超媒體。

選項3:使用XHtml。 我不明白為什么你的解析器有Xhtml的問題,但我會接受你的話。

無論底層標記語言如何,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"
}

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

<result>1234</result>

以上示例結合關於如何取消引用結果元素內容的媒體類型規則是超媒體,其方式與:

<result>/foo/1234</result>

有一個規則來預先添加基本http URI。 下面是一個示例,其中http字符串是可解除引用的事實可能是隱含的。

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

然而,雖然它們都是超媒體並且滿足了這種約束,但我會反對創建自己的新超媒體制作規則和標簽,如果可能的話,只需重新使用現有規則和標簽。 第一個示例使用戶不太明白此元素表示超過上一個示例的超鏈接資源。

我建議不要手動編碼這些超鏈接,而是使用為您創建這些超鏈接的工具。 面向交互的編程是創建這些交互(超鏈接)的好方法。 請關注此鏈接,此技術適用於我們http://www.masterkube.com/hateoas_technology.html

至少(即使你什么也不做),你應該把你的URL放在XLink屬性而不是元素內容中:

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

XML處理器能夠本地解析和跟蹤這些URI作為URI。 作為一般規則,不可翻譯或永遠不能具有子元素的文本應該屬於強制執行此類限制的屬性。

但除此之外,做其他人的建議並定義您的媒體類型,以便客戶可以理解其含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM