2012-01-27 59 views
0

說,例如,我有一個REST api網址設計與「客戶」作爲資源。REST api/url設計爲多元化/ post方法的資源

現在,我希望能夠列出所有的客戶,通過ID或郵件地址查找特定客戶
另外,我希望能夠添加新的客戶......

難道這些例子的URI對?
或者我應該以另一種方式做它..?

/客戶/ 1234
得到客戶ID爲1234

/customer/email/[email protected]
得到客戶的電子郵件地址

[POST]
/customer/
創建新客戶

/客戶/
列表中的所有用戶(通知複數)

回答

0

這是我會怎麼做:

/客戶/ 1234

customer/[email protected] 或(如果電子郵件不保證是唯一的) customers /[email protected]

[POST] /客戶/(注意複數,下同)

[GET] /客戶/

乾杯,

Ferenc的

+0

聽起來不錯 - 爲什麼不只是[POST] /客戶/然而? – Alex 2012-01-27 17:46:53

4

根據我的經驗,RESTful API使用複數形式的單一資源路徑。這個想法是,你有customers,當你想與一個客戶進行交互時,你通常會與customers資源進行交互。

GET /customers獲得客戶名單。

POST /customers創建一個新客戶。

GET /customers/:id以獲得具有唯一ID的特定客戶。 (通常不是像email這樣的客戶的屬性)

GET /[email protected]以獲得具有特定屬性值的客戶。

Apigee有一個blog post涵蓋了您可能想要閱讀的複數。

+0

對於RESTful系統,URI是不透明的。命名網址沒有正確或錯誤的方式。資源粒度和資源之間的聯繫是設計的關鍵部分。 – 2012-01-28 15:13:26

1

如果我在設計這個API,我會從一個像HAL這樣的通用超媒體類型開始,並設計一個根表示,使我可以訪問使用鏈接和uri模板描述的各種場景。

e.g

GET /api 
=> 
<resource> 
    <link rel="urn:mycompany:customer" href=".../{id}"/> 
    <link rel="urn:mycompany:customers" href="..."/> 
    <link rel="urn:mycompany:customersearch" href="...{?email}"/> 
</resource> 

我還沒有填寫實際的URL,因爲從中其實並不重要,這些URL是如何構成的API的消費者的角度。在你的服務器框架中做最簡單的事情。如果發現錯誤,請不要擔心,稍後可以更改它,並且客戶端不會因爲它們應該從根表示中發現URL而中斷。

假設將客戶發佈到一組客戶將創建一個新的客戶是相當普遍的,因此您可以只需要您的客戶使用該鏈接。或者,如果您希望更加明確,您可以定義一個新的鏈接關係,提供創建客戶的URL。

-1

爲什麼不是robust並啓用/ customer和/ customers?

GET/customer/1234或/ customers/1234檢索相同的資源。

GET/customer或/ customers給出所有客戶的列表。

POST給/ customer或/ customers創建一個新客戶。

+4

因爲您應該避免在兩個不同的URL上返回相同的資源。它會導致緩存污染。如果您需要兩個網址,則其中一個應爲303。 – 2012-01-28 15:10:26