2012-11-28 42 views
1

假設我想獲取我的公司在緬因州擁有的所有商店的列表。從概念上講,這個請求可以被看作是使用RESTful URL識別收集子集

/stores?state=Maine (All stores such that the state of the store is Maine) 

/states/Maine/stores (All of Maine's stores) 

哪個更RESTful的,爲什麼?我的理解似乎都有其優缺點。

編輯:

我原來的例子存在的問題是有店鋪的狀態的子資源可能沒有直觀的感覺,所以這裏的另一個更詳細的例子:假設我可以用ISBN全球識別的書籍,或每個作家通過標題(假設沒有作者姓名兩本自己的書)。所以,根據這個計劃/books/0-525-94892-9/authors/Ayn_Rand/books/Atlas Shrugged會參考同一本書。所以如果我想要Ayn Rand的所有書籍,我會GET /books?author=Ayn_Rand還是GET /authors/Ayn_Rand/books

+1

考慮到各國的名字是獨一無二的:) – Alexander

回答

1
哪個更RESTful的,爲什麼?

兩者同樣都是RESTful(儘管從技術上講,REST URI是不透明的,所以沒關係)。哪一個最適合你的用例取決於你的資源層次。

從您的書籍例子中,我將使用ISBN,因爲它是其他地方使用的那本書的標識符。可能有其他書籍被稱爲「Atlas Shrugged」,並且可能有其他作者稱爲「Ayn Rand」,或者同一作品的派生版可能會更改名稱,或者列出第二個作者(如果編輯充分)。您需要提供至少兩個數據,即{author-name, book-name},甚至可以使用{publication-year}來唯一標識該圖書。使用ISBN號碼,您只能使用一個數據來識別該書。

一種/authors/{author-name}/books/{book-name}請求可能返回一個302 Found響應或更好,具有/books/{isbn}一個Content-Location頭還書和使用rel="canonnical self"鏈接在響應指向ISBN URI的資源。

編輯
我會從我自己的API提供了一個例子:
我們有jobscontactssites。所有都是頂級資源。網站代表具有地址的實際地點。聯繫人通常代表一家公司,但有時候是個人或像學校這樣的組織。一個網站有一個owner這是一個聯繫人。當你去那個地址時,所有者就是標誌上的名字。作業是頂級資源。喬布斯有clientsitesite_owner。作業的客戶是聯繫人(並非所有聯繫人都是客戶),作業的site_owner是該作業時該網站的所有者,因爲隨着時間的變化等,網站的所有者可能會隨時間而改變。我們有時也爲不是網站所有者的客戶(即分包商)提供工作。我們需要保留在一個網站上完成的所有作品的歷史記錄,而不管客戶是誰,當時擁有該建築物的人等。
因此,可以訪問特定客戶的網站上完成的工作作業列表在幾個URI下,/contacts/{id}/sites/{id}/jobs,/sites/{id}/jobs?client={id},/contacts/{id}/jobs?site={id},但實際上它們只是作業列表中的過濾器,完全等同於/jobs?client={id}&site={id},實際上所有的URI都是有效的,並且最終得到相同的PHP文件並將相同的變量設置爲相同的值並運行相同的查詢,一些只是採取更迂迴的路線,並執行幾個include調用。
原因爲什麼我允許所有這些不同的URI只是因爲它允許我的用戶在他們的導航heirarchy(變量「breadcrumbs」取決於到達列表所採用的路徑,「輕微」改變了返回的表示),並且由於數據集是實時的,對於您可能正在查看的事物而言具有高度動態性,因此HTML結果是無法訪問的,所以通過不重複使用機器URI可以提供更多的好處,兩側。

所有的外賣是:

  • 使用一個唯一的標識符爲你的資源,或創建一個(id)如果你的資源本身並沒有附帶一個(例如ISBN)

  • 你選擇什麼樣的URI無關緊要,你的API的RESTful的是

1

除非/states/states/Maine也是你的系統中的資源,我會用第一個例子。

+0

呀,狀態是所有事情都考慮不好。我已經更新了使用更好的問題(作者和書籍)的問題,如果作者和書籍都是一流資源,該怎麼辦? –

1

在這兩個例子中(州/商店和作者/書籍),我會使用後一種方案。

它允許您以直觀的方式公開各種不同的資源。該URI清楚你所期望的資源,它表示在使用限制爲「路徑」,而那的?key=value&foo=bar&so=on...

一個爛攤子讓我解釋...

/authors/ 

將返回一個列表的所有作者資源。

/authors/Ayn_Rand/ 

將返回Ayn Rand資源,該資源可能包含有關Rand女士的信息。

/authors/Ayn_Rand/books 

會返回Ayn Rand的書目清單。這可能看起來像一個圖書「普通」名單:

[ 
{ 
    title: 'Atlas Shrugged', 
    genre: 'Fiction' 
    slug: 'atlas_shrugged' 
}, 
{ 
    title: 'The Fountainhead', 
    genre: 'Fiction', 
    slug: 'the_fountainhead' 
}, 
{ 
    title: 'Capitalism: The Unknown Ideal', 
    genre: 'Non-fiction', 
    slug: 'capitalism_the_unknown_ideal' 
} 
] 

您不妨使用也使用超媒體通過自己的ISBN嚴格參考相關書籍:

... 
{ 
    title: 'Atlas Shrugged', 
    genre: 'Fiction', 
    location: '/books/0-525-94892-9' 
}, 
...