首先,餐廳和飯盒的更新應該在一個請求中完成。不要陷入嘗試通過REST API執行事務的陷阱。
在我們談到您的具體問題之前,讓我們爲客戶如何與您的服務進行交互以引導您的問題奠定基礎。
客戶端應該始終從根服務url開始。
GET /DiningService
Content-Type: application/vnd.sample.diningservice+xml
200 OK
<DiningService>
<Link rel="diners" href="./diners"/>
<Link rel="lunchboxes" href="./lunchboxes"/>
<Link rel="foods" href="./foods"/>
</DiningService>
我不知道你的用戶將與客戶端軟件的交互方式,還是讓我們假設,我們首先需要確定誰是打算做飲食。我們可以通過查看與rel =「diners」鏈接的響應來檢索用戶列表,並按照該鏈接進行查看。
GET /DiningService/diners
Content-Type: application/vnd.sample.diners+xml
200 OK
<Diners>
<Diner Name="Frank">
<Link rel="lunchbox" href="./Frank/lunchbox"/>
</Diner>
<Diner Name="Bob">
<Link rel="lunchbox" href="./Bob/lunchbox"/>
</Diner>
</Diners>
返回的是用餐者列表。爲了簡單起見,我選擇了創建自定義媒體類型,但是對於這些列表,您最好使用Atom提要等。 客戶需要識別弗蘭克作爲餐廳,所以現在我們想要訪問他的飯盒。我們的自定義媒體類型的規則說,弗蘭克的午餐盒 的鏈接可以在帶有rel =「飯盒」的鏈接元素中找到。 我們從響應文檔中獲取該URL並按照它進行操作。
GET /DiningService/Frank/lunchbox
Content-Type: application/vnd.sample.lunchbox+xml
200 OK
<Lunchbox>
<Link rel="diner" href="/DiningService/Frank"/>
<Food Name="CheeseSandwich" NutritionPoints="10">
<Link rel="eat" Method="POST" href="/DiningService/Frank?food=/DiningService/Food/CheeseSandwich"/>
</Food>
<Food Name="CucumberSandwich" NutritionPoints="15">
<Link rel="eat" Method="POST" href="/DiningService/Frank?food=/DiningService/Food/CucumberSandwich"/>
</Food>
</Lunchbox>
我們得到的回覆是另一種自定義介質類型定義描述我們可以用飯盒做一個飯盒和鏈接的內容。一旦客戶選擇吃飯的食物,我們可以通過尋找與rel =「eat」的鏈接並遵循該URL來識別要跟隨的URL。在這種情況下,這是一個帖子。
POST /DiningService/Frank?food=/DiningService/Food/CucumberSandwich
Content-Type: None
200 OK
我沒想到太難什麼構建url的最好的辦法就是,因爲如果我改變了主意,下週並使其
<Link rel="eat" Method="POST" href="/DiningService/Frank/Mouth?food=/DiningService/Food?id=759"/>
甚至
這對客戶來說並不重要,因爲它會繼續尋找rel =「eat」的鏈接,並且會跟隨該URL。您可以選擇任何適用於您選擇的Web框架的最簡單的URL結構。 URL結構屬於服務器,您應該可以隨時對其進行更改,並且對客戶端幾乎沒有影響。
如果你採取這種方法,你可以停止強調提出完美的網址。這種「RESTful URL」的虛假概念已經做得更多,以防止人們學習REST而不是SOAP。
謝謝。不過,我在這裏看到了一些我想問的問題。首先,不是「吃」一個令人困惑的選擇,因爲它是一個動詞?這就是爲什麼我想用「餐」的原因,因爲然後你發佈一個新的餐(即關於REST資源的全部名詞是名詞)。其次,由於行動不是冪等的,不應該是POST而不是PUT?最後,這意味着即使用戶不一定要求更新該模型,那麼/餐廳/坦率/吃飯也會有更新LunchBox模型的副作用。在REST下還是猶太教嗎? – mrjake2 2010-01-30 01:11:18
開始發表評論,但是當我用完字符時修改了我的帖子 – 2010-01-30 02:19:50
哦,你說得對vs post,代碼已經修改,我從routes.rb剪切/粘貼我有方便。 – 2010-01-30 02:27:22