2012-09-21 85 views
5

大多數REST的教程安排資源如下:設計REST風格的URL的網頁

GET /car/  -> list of cars 
GET /car/<id>/ -> info about specific car 
POST /car/  -> create a new car 

但構建Web應用程序在瀏覽器中使用時,存在很少討論,然後才能發佈到缺失的環節/汽車/,你需要獲得一個表格來創建一個新的資源(汽車)。這個表單的URL應該是什麼?

我通常使用:

GET /car/new/ -> form for creating a new car 
POST /car/new/ -> redirect to /car/<id>/ if item is created else show form with invalid fields highlighted 

但根據http://www.slideshare.net/Wombert/phpjp-urls-rest這不是一個很好的REST URL。我可以看到它爲什麼不是一個好的REST,因爲「新」實際上用作動詞而不是資源,但表單應該在哪裏,因爲GET /car/已用於列出汽車,因此您不能使用GET /car/新車的形式。

總之,我的問題是:「創建資源表單的RESTful URL是什麼?」

在一個稍微相關的說明中,即使在Web服務中,依靠客戶端事先知道架構有時並不總是明智的,因此即使在Web服務中,也可能需要客戶端請求資源的當前模式。 AFAICS,這與需要獲取創建表單(即表單有點像描述如何構建POST查詢以創建資源的模式)類似的情況。我的思路是否正確?

+0

不能滿足這個足夠!在任何地方都沒有提到這個缺失的鏈接,可悲的是也沒有令人滿意的答案。 – aefxx

回答

2

REST不會太在意你的URI的樣子,只要確定一個獨特的資源,而且是自描述。符合這些標準,除此之外,這是個人偏好。沒有任何東西禁止在URI中使用動詞,如果它使用一個動詞是有意義的。

關於您稍有相關的筆記,您在表格作爲模式時所暗示的是媒體類型。 RESTful架構涉及客戶端和服務器都理解用於表示應用程序狀態的媒體類型。

甲REST API應該花費幾乎所有的描述的努力中 定義用於表示資源和驅動 應用狀態的媒體類型(一個或多個),或在定義擴展關係的名稱和/或 啓用超文本標記適用於現有的標準媒體類型。用於描述何種方法的任何 花費在用於媒體類型(並且在大多數情況下已經由現有的 媒體類型定義)的處理規則 的範圍內應該完全定義的什麼URI上。

更多在這裏閱讀:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

也就是說從羅伊菲爾丁,誰定義REST的人。一般來說,你的媒體類型應該是可擴展的 - 也就是說,除非必要,否則任何更改都應該添加並且不會破壞較舊的客戶端。

+0

我想我想要的是其他人如何在其REST式URL中解決此問題(需要GET創建表單)的示例。我使用的另一種方法是將創建表單放在/ car /頁面上(這將非常完美的RESTful),但是從可用性角度來看,例如,如果/ car /頁面已經太擁擠,這並不總是合適的。 –

+2

如果你定義了一個'/ cars /:id'的路線,並且你試圖讓你的表單位於'/ cars/new'之類的地方,那麼你就不能擁有一個id爲'new'的汽車 - 謹慎的。也許你可以有像'/ forms/add-new-car'這樣的東西。 – tuespetre

2

我一直認爲「form」本身不是資源,所以/<name>/new沒問題 - 表單不是API的常用元素。幻燈片的作者將其列入「不良」名單,但沒有提供正確的名單 - 我認爲他是如此RESTful,他忘了考慮這種情況。

+0

問題是'/ /new /'暗示'/ /new /'是一個子資源'/ /',而不是'/ /new /'實際上是對'/ /' –

+1

我同意,但仍然 - 您提供了答案,爲什麼它不好(我已經知道),而不是正確的答案或其他建議。你能給我們提出新的想法嗎? –