2012-03-14 90 views
2

我正在設計一個RESTful Web服務,並試圖正確使用超媒體來建立資源之間的關係。對於某些資源,客戶端需要能夠將關係分配給另一個資源,但是在我看來,要求客戶端生成超鏈接和POST/PUT/PATCH /無論這個超鏈接到資源中有什麼缺點(更復雜對於客戶端,安全和負載平衡問題等)。我在想讓客戶端發送一個簡單的ID並讓服務器生成URL會更好。RESTful更新資源超鏈接

以下是一些爲鋼琴租賃API設計的資源,用以展示我的想法。

GET http://company.com:9999/customers/42 
{ 
    "id"  : 42, 
    "name"  : "George P. Burdell", 
    "phone"  : "555-555-5555", 
    "piano"  : { "href" : "http://company.com:9999/pianos/101"} 
} 

GET http://company.com:9999/pianos/101 
{ 
    "id"  : 101, 
    "make"  : "Steinway", 
    "model"  : "Model D" 
} 

假設客戶想租一架不同的鋼琴。

客戶端發送一個部分更新,如:

PATCH http://company.com:9999/customers/42 
{ "piano" : 202} 

服務器會再生成正確的URL到新的鋼琴資源並相應更新:

GET http://company.com:9999/customers/42 
{ 
    "id"  : ..., 
    "name"  : ..., 
    "phone"  : ..., 
    "piano"  : { "href" : "http://company.com:9999/pianos/202"} 
} 

編輯: 作爲我看到它,客戶直接更新超鏈接可能會有問題。這是一個RESTfully好的解決方案,還是有更好的解決方案?這甚至不是問題嗎?此外,以某種方式更新資源超鏈接的客戶的真實世界示例將非常棒 - 我還沒有找到任何示例。

+0

我喜歡這個主意,它是乾淨和優雅,爲所有實體所在內的,只要工作相同的REST webservice ...與所有API(不僅僅是REST風格的)一樣,一個合適的文檔是強制性的......我不是主打的:什麼是你的問題/目標? – Yahia 2012-03-14 16:44:20

+0

謝謝,好點。直接更新超鏈接的客戶似乎有問題,我正在尋找一個乾淨的解決方案或有人向我解釋爲什麼這不是問題。當我開始輸入問題時,上面的解決方案對我來說就是我決定拋出去徵求意見。 – HolySamosa 2012-03-14 16:59:19

回答

1

您的回覆缺少RESTful系統HATEOAS contraint所需的鏈接和表單。例如,如果客戶想要租用不同的鋼琴,那麼您可以在鋼琴響應中添加一個「租金」表單。例如

GET http://company.com:9999/pianos/101 
{ 
    "self"  : "http://company.com:9999/pianos/101", 
    "id"  : 101, 
    "make"  : "Steinway", 
    "model"  : "Model D", 
    "rent"  : { 
     "href"  : "http://company.com:9999/pianos/101", 
     "method" : "post" 
     // you can add form parameters like from and to dates here 
    } 
} 

IMO應該創建一個「出租」資源,這將提供鋼琴和客戶之間的多對多關係。然後,要讓客戶取消租賃,您可以在租賃協議中填寫刪除表單。

這裏有一些好文章涉及這樣的: