2012-11-02 35 views
0

我正在爲網站構建RESTful API,允許用戶創建包含小部件的小部件和標籤(想想igoogle.com/netvibes.com),我想分享我的URL設計以獲取洞察。小工具的RESTful URL設計檢查

下面是簡單的規則:

  1. 有一個可用widgetTypes的靜態列表供用戶挑選。

  2. 用戶可以創建每個widgetType的一個或多個widgetInstances。

  3. 用戶可以創建一個或多個標籤/含widgetInstances

此API需要僅用於將由JavaScript消耗JSON儀表板。我們還可以假設所有的身份驗證都將通過cookie來處理。

的API需要服務:

  1. CRUD用戶的標籤

  2. CRUD特定用戶widgetInstances的

  3. 檢索所有選項卡爲用戶

  4. 檢索給定選項卡的所有widgetInstances。

  5. 檢索用戶添加窗口小部件的所有可用窗口小部件類型。

設計:

選項卡控制器:

widgetAPI.com/tabs - >返回用戶可用的所有選項卡的元數據(ID,標題)。

widgetAPI.com/tabs/1 - >返回標籤ID爲1的元數據(標題)如果用POST,更新標籤ID發送1

widgetAPI.com/tabs/1/widgets>返回所有標籤ID的widgetInstances 1.

問題1:理想情況下,我想跟隨widgetAPI.com/tabs/1的設計也返回給定的標籤,但與設計,widgetAPI.com/所有widgetInstances標籤可能會返回太多的數據,因爲我必須返回所有選項卡的所有小部件。因此,我需要創建一個單獨的「widgetAPI.com/tabs/1/widgets」URL,但也必須返回標籤元數據,因爲我不想進行兩次HTTP調用以獲取元數據&小部件。請告知,因爲我不確定這裏的最佳方法。

widgetAPI.com/tabs/create - >創建一個新的標籤

widgetAPI。COM /選項卡/刪除/ 123 - >刪除tabid 123

窗口小部件控制器:

widgetAPI.com/widgets/123 - >如果通過POST發送返回爲widgetInstanceId 123更新123的數據。

widgetAPI.com/widgets/Create?typeID = 2 - >創建的typeid = 2的新widgetInstance這隻會是一個POST請求,以便TYPEID可以是交參數。

widgetAPI.com/widgets/delete/123 - >刪除widgetInstance 123

問題2所以有一個規則,我還沒有能夠滿足呢。我需要返回所有可用的widgetType,我不知道如何將這個請求放入前兩個控制器中。我目前正在傾向於單獨服務。所以像widgetAPI.com/getWidgetTypes。思考?

謝謝你們。如果您可以對整體設計進行批評,只需解決問題或提及任何我應該注意的事情,那將會很棒,因爲這是我第一次設計一款REST風格的應用程序。再次感謝。

+0

您是否在使用常規的MVC控制器?還是WebAPI? – danludwig

回答

2

widgetAPI.com/tabs/1 - >返回如果發送 與POST標籤ID爲1的元數據(標題),更新標籤ID爲1

甲POST上述URL應該不更新標籤1. PUT到URL應該更新選項卡1.

widgetAPI.com/tabs/create - >創建一個新的標籤

要創建一個新的選項卡,你應該張貼到widgetAPI.com/tabs

widgetAPI.com/tabs/delete/123 - >刪除tabid 123

要刪除選項卡123,發送一個DELETE widgetAPI.com/選項卡/ 123

widgetAPI.com/widgets/123 - >如果通過POST

發送返回數據widgetInstanceId 123更新123要更新插件123,仙噠PUT到widgetAPI.com/widgets/123

widgetAPI.com/widgets/Create?typeID = 2 - >創建typeid的新widgetInstance = 2。這將只有一個POST請求,以便TYPEID可能是一個發佈參數。

要創建一個新窗口小部件,請發送POST到widgetAPI.com/widgets。 typeId應該是POST請求主體的一部分。

widgetAPI.com/widgets/delete/123 - >刪除widgetInstance 123

要刪除插件123,發送一個DELETE請求到widgetAPI。com/widgets/123

答案1:我喜歡widgetAPI.com/tabs/1/widgets的URL設計。另外,我喜歡對元數據和數據進行兩次不同的調用。

答案2:我想你應該用一個單獨的控制器來做到這一點。儘管我不喜歡這個網址。相反,我喜歡HTTP GET widgetAPI.com/widget-types或只是widgetAPI.com/widgettypes

一般來說,除非你想你的客戶能夠創建URL標識,遵循此模式:

網址:/任何資源 GET - 返回此類型 POST的所有資源 - 創建新的資源

網址:/任何資源/ {ID} GET - 與ID PUT返回單個資源 - 更新資源,其ID DELETE - 與ID刪除資源

你可以還允許PUT請求/ whatever-resource/{id}創建資源,但客戶端/用戶必須指定id(隱含地,URL,因爲URL包含id)。如果你不想讓用戶提供這些信息,而是讓服務器生成它,那麼POST到/ whatever-resource來創建資源。

+0

非常感謝。據我瞭解,一些瀏覽器對PUT和DELETE有限制嗎?我仍然可以依靠這兩個HTTP動詞並將它們從URL中提取出來嗎? – user715489

+0

這就是爲什麼我提出評論。如果使用普通的MVC,你可以用X-HTTP-Override僞造PUT或DELETE。有一個HtmlHelper的。你可能也想看看AttributeRouting.NET,特別是它的'RestfulRouteConventionAttribute'。 – danludwig

+0

使用常規的MVC控制器,但我可以自由切換到WebAPI。這會有幫助嗎? – user715489