2012-06-19 34 views
3
我無法找到一個答案

簡單的問題..REST風格的URL中使用不同的字段,以獲取資源

如果我有一個REST Web服務,而我的設計不使用URL參數,我怎麼能指定兩個不同的鍵返回相同的資源?

例 我想(和已實施)

/Person/{ID} 

預期它返回一個人。

現在我也想

/Person/{Name} 

它的名字返回的人。

這是正確的RESTful格式嗎?或者是這樣的:

/Person/Name/{Name} 

回答

4

您應該只使用一個URI來引用單個資源。擁有多個URI只會造成混淆。在你的例子中,由於兩個同名的人會產生混淆。他們指的是哪一個人資源?也就是說,你可以讓多個URI指向一個資源,但對於除「真實」URI之外的任何其他資源,只需使用狀態碼301 - Moved Permanently將客戶端重定向到正確的位置即可。

就我個人而言,我永遠不會實現多ID方案或重定向來支持它。選擇一個識別方案並堅持下去。你的API的用戶會感謝你。

您真正需要構建的是一個查詢API,因此請專注於如何實現類似於/personFinder資源的資源,該資源可能會將名稱作爲參數,並在響應中返回潛在的多個匹配的/person/{ID} URI。

1

我想從技術上,你可以同時擁有的URI指向相同的資源(也許他們中的一個作爲典型的資源),但我想你不會想從這樣做實施視角。如果ID和名稱之間有重疊,該怎麼辦?

它肯定不會看起來像使用查詢參數的好地方,但如果你堅持不這樣做,也許你可以做

person/{ID} 

personByName/{Name} 
+0

我認爲會有一個標準的做法,似乎對我來說很普遍。感謝您的輸入。 – Erix

+0

我認爲這樣做的最標準方法就是你已經排除了 - 查詢參數。順便說一句,你的URL的內容並不會使它成爲RESTful,但這似乎並不是問題的核心。 – pc1oad1etter

+0

如果你只是創建一個新的URI模式來進行名稱搜索(比如/ personByName/{Name},那麼你最終會爲每個你想到的新參數(以及這些參數的每個組合)創建一個新模式。對於這種可能性你可以做到這一點,我感覺很好,你可以這樣做。然而,更爲標準的做法是讓/ person?name = {Name}返回匹配的人員列表按名字。 – pc1oad1etter