2011-07-12 124 views
1

在我們的系統中,我們擁有包含項目的帳戶。一個項目總是與一個帳戶關聯,但在系統中也具有全球唯一的ID。有時只需知道其ID就可以使用該項目。RESTful API創建全球唯一資源

允許從外部所有者(賬戶)訪問下級資源(項目)是不正確的?換句話說,擁有2個URI到同一個資源是錯誤的嗎?這是一個有點棘手解釋那麼這裏有一個例子:

POST /inventory/accountId 
    #Request Body contains new item 
    #Response body contains new item's id 

GET|PUT|DELETE /inventory/accountId/guid #obviously works and makes sense 

GET|PUT|DELETE /inventory/guid #does this make sense? 

也許我應該重新思考自己的資源佈局,而不是使用帳戶創建項目,而是把帳戶作爲該項目的查詢字符串參數或領域?

POST /inventory 
    # Request body contains item w/ account name set on it 

GET|POST|DELETE /inventory/uuid #makes sense 

GET|POST|DELETE /inventory/accountId/uuid #not allowed 

回答

1
POST /inventory/accountId 
GET|PUT|DELETE /inventory/accountId/guid #obviously works and makes sense 
GET|PUT|DELETE /inventory/guid #does this make sense? 

這是最有意義的時候/inventory/guid重定向到/inventory/accountId/guid(或者,我要說,反之亦然)。擁有一個單一的規範實體,並且多個URI重定向到它,可以讓您的緩存方案保持最直接的狀態。如果這兩個URI返回的是相同的數據,那麼用戶不可避免地會將一個新的表示重新放入一個表單中,然後在從另一個表單獲取舊副本時會被混淆,因爲緩存只對前者無效。兩者的後續GET可能會出現類似的問題。重定向保持更清潔(不完全同步,但更清潔)。

是否使項目從屬於賬戶取決於項目是否可以存在沒有賬戶。如果某個項目的數據是某個帳戶數據的子集,請繼續並使其成爲下級。如果您發現某個帳戶只是一種容器,或者某些項目沒有任何容器,則將其提升到最高級別。

+0

我認爲重定向是最有意義的,如果我要支持多個URI的。考慮一下之後,我會試着避免這一點。爲了在帳戶下創建項目,我忘了我可以使用Location標頭來指示創建資源的URI,這樣可以消除我最擔心的問題。 –

1

換句話說,這是錯誤的有2 URI的相同的資源?

不是。讓多個URI標識相同的資源並沒有錯。我的第一個方法也沒有看到任何問題。請記住,URI是唯一的標識符,對客戶端應該是不透明的。如果他們唯一標識一個資源,那麼您不必過於擔心使您的URL看起來漂亮。我並不是說資源建模並不重要,但IMO不應該花太多時間在其上。如果您的企業需要直接在庫存和個人賬戶下進行指導,那就這樣吧。

+1

W3C TAG已經推薦只有一個URL應該返回資源。其他引用該資源的URL應該重定向。 http://www.w3.org/2001/tag/issues.html#httpRange-14 –

1

您是否擔心這會造成數據泄露給未授權用戶?或者你的關注純粹是設計驅動的?

如果您不關心安全問題,我同意讓2個URIS指向相同的資源是完全正確的。

2

我認爲有兩個URI指向相同的項目是在尋求麻煩。根據我的經驗,當您向外擴展(緩存,羣集中的多個節點不同步等)時,這些事情會導致瘋狂。只要該項目的ID確實是全球唯一的,就沒有理由不簡單地將其稱爲/inventory/uid