我在理念上很難理解關於版本化資源URL的真實情況。不同版本的資源的REST風格的URL
比方說,我有一個跟版本控制系統類似的跟蹤食譜的應用程序,就像RCS之類的舊學校一樣。每個版本都可以是一段時間的工作副本,然後再創建一個新版本。每個版本都有與其相關的評論,並且不會共享評論。我可以在任何時候回顧歷史,看看配方的演變過程,但每個實例總是被視爲相同配方的一個版本。我試圖找出最合適的方式來構建URL來引用這些,並且我很難理解類似子資源和時間資源等之間的一些差異。
我已經看到了這一點做的兩種主要方式是:
> 1) query parameters
> -- /recipes/ultimate-thing -> List of available versions of Ultimate Thing
> -- /recipes/ultimate-thing?version=2 -> Version 2 of Ultimate Thing
> -- /recipes/ultimate-thing?version=latest -> Current working version of Ultimate Thing
2a) Nested resources with versions considered subresources
-- /recipes/ultimate-thing/versions/ -> List of available versions of Ultimate Thing
-- /recipes/ultimate-thing/versions/2 -> Version 2 of Ultimate Thing
-- /recipes/ultimate-thing -> Current working version of Ultimate Thing
2b) Nested resources with the list at the resource
-- /recipes/ultimate-thing -> List of available versions of Ultimate Thing
-- /recipes/ultimate-thing/versions/2 -> Version 2 of Ultimate Thing
-- /recipes/ultimate-thing/versions/latest -> Current working version of Ultimate Thing
我覺得每次我試圖說服的做這件事的一種方式我自己我覺得我缺乏瞭解,構建一個適當的理由爲那個方法。
1似乎被很多rails用戶所青睞,但我不知道如何清楚自我POST到特定資源後何時創建新版本配方(/recipes/ultimate-thing)通常希望創建具有該名稱的資源(如果該資源不存在),是否適合返回404而不是創建它,並且只發布到/食譜以創建新配方然後允許郵政/食譜/終極東西創建一個新版本?另外,評論如何表示?沒有版本我可以做類似/食譜/最終的東西/評論,但/食譜/ utlimate-things /評論?版本=最新似乎醜陋,而2b似乎更明確「評論最新版本的終極事物配方「,2a似乎是最乾淨的。
其實,我一般喜歡2A最好的,但我無法搞清楚這版本的食譜子資源因爲沒有菜譜,一個版本是配方而是食譜的所有版本應該進行邏輯分組一起。
我也在這裏看到了2b的stackoverflow,但它似乎可能過於冗長,因爲你總是需要像/recipes/ultimate-things/version/latest/comments之類的東西。儘管如此,如果我將版本看作是可以註釋說明的成分集合,並且配方是共享類似意圖的版本集合,那麼這確實是最有意義的。
我真的很喜歡2a,但有沒有什麼東西與我失蹤的方法,這是一個壞主意?我是否錯過了一個如何工作的東西,這使得它似乎更受衆多人的青睞?
或者,它將使更多的意義,總是做這樣的事情/食譜/最終-事/最新或/食譜/最終-事/ 2 /評論即使,使得它的至少明確,這些都是同一配方的不同修訂?
我不確定這是否是一個超級適合的論壇,我只想討論它,所以我明白爲什麼一種方法會比另一種更好。
雖然這似乎是最合理的解決方案,將它作爲一個參數,真正解決應該使用該版本作爲資源獲取的另一個元數據,類似於MIME類型。爲什麼通過Accept頭協商內容,而不是通過另一個頭協商版本? – 2013-02-27 22:50:03
@DiegoSevilla我公開承認我的建議是基於觀察到的慣例的意見。 REST的許多方面(動詞,狀態代碼)都由HTTP規範明確定義,並不打算解釋。我沒有看到規範中的任何內容,但它定義了一個URI標準(我也只是剔除了它).....所以我對你的問題是 - 你建議使用HTTP標頭(a)約定還是(b)由HTTP規範建議的東西。 – EJK 2013-02-27 23:21:19
@DiegoSevilla - 請重新閱讀您的問題「爲什麼通過Accept頭協商內容,而不是通過另一個頭協商版本」。我的答案是Accept頭可以確定資源的表示形式。將版本放在URI中標識資源本身。是的,我假設不同的版本在概念上是不同的資源。 – EJK 2013-02-27 23:23:54