2012-08-07 49 views
4

在一個RESTful應用程序中,我們如何區分「動作」和HTTP動詞(GETPOSTPUT,DELETE)?在一個RESTful應用程序中,我們如何區分「動作」和HTTP動詞(GET,POST,PUT,DELETE)?

例如,據我所知,GET請求資源/products應該返回一個所有產品的列表。 A POST要求/products應該創建一個新產品。那麼,用戶如何請求用於創建產品的原始表單?我最初的迴應將是對同一個URI的GET請求,但如上所述,這應該返回所有產品的列表 - 不是創建產品的空白表單。

在我研究過的大多數框架中,通過使URI的「action」部分解決了這個問題。例如,對/products/createPOST請求將創建一個新產品,而對/products/createGET請求將爲創建產品提供空白表單。要獲得所有產品的列表,將根據所討論的框架向/products/products/get,/products/read等發出GET請求。這種方法解決了上述含糊不清的問題,但與我讀到的有關傳統REST設計的內容相沖突。

+0

'但它與我讀到的有關傳統REST設計的內容相沖突 - 爲什麼? – 2012-08-07 23:31:13

+0

@RobertHarvey:因爲「動作」與HTTP動詞是多餘的。如果在URI中指定了一個動作,那麼你只需要兩個動詞(即'GET'和'POST')。 – FtDRbwLXw6 2012-08-07 23:34:10

+1

在純REST環境中,您將訪問資源,而不是操作。所以,爲了讓表單創建一個新產品,你需要在/ products/form URI上發出一個GET。然後,您可能會使用Javascript將表單轉換爲JSON請求,然後您可以將其放入/產品。正如您已經指出的那樣,很少有這樣的方式,可能部分是出於方便的原因,部分原因是REST通常不會被大多數Web資源充分利用。 – 2012-08-07 23:41:28

回答

2

恕我直言,最好的選擇是讓請求方法控制的行動的一部分。

比方說您正在訪問http://who.cares/product/42http://who.cares/product/42/specification。這個查詢到網絡服務器將轉換爲Product控制器。操作名稱應該通過結合請求方法和命令來創建:

DELETE "http://who.cares/product/42" 

    controller: "Product", 
    action:  "deleteProduct()" 


GET "http://who.cares/product/42/details" 

    controller: "Product", 
    action:  "getDetails()" 


POST "http://who.cares/product/42/review" 

    controller: "Product", 
    action:  "postReview()" 


GET "http://who.cares/products/ 

    controller: "Products", 
    action:  "getProducts()" 


POST "http://who.cares/products/ 

    controller: "Products", 
    action:  "postProducts()" 
+0

該選項如何處理請求輸入新產品的空白表單? URI和動作是什麼? – FtDRbwLXw6 2012-08-07 23:43:40

+0

這或多或少是它在ASP.NET MVC中的工作方式。但是由於控制器方法通常是URL的一部分,您仍然可以在URL中看到控制器方法名稱,如在/ products/create中。 GET和POST只在表單請求和SUBMIT中分開。 – 2012-08-07 23:44:07

+0

@tereško:但這並不能解釋請求新產品表單和提交它之間的區別。我得到提交這將是一個'POST /產品',但請求的形式是什麼?它不能是'GET/product',因爲它應該返回所有產品的集合。 – FtDRbwLXw6 2012-08-07 23:47:59

1

我這裏是喜歡Rails會

REST request path | action name | Description 
---------------------|-------------------|------------- 
GET /profile/new | new    | Render a form for creating the profile 
POST /profile  | create   | Create a the profile from the received data 
GET /profile  | show    | Render a the profile 
GET /profile/edit | edit    | Render a form for editing the profile 
PUT /profile  | update   | Update the profile based on the received data 
DELETE /profile  | destroy   | Destroy the profile 

我看不出有任何衝突,想法是 網址是人類可讀的,你可以引入新的URI來顯示相同​​資源的不同表示。 (如個人資料/ 1 /編輯和個人資料/ 1) /個人資料/新 - 空白個人資料的地址(如顯示方法中的個人資料/ 1,個人資料/ 2 ..等) 但是,如果你想要的話,/1 /編輯是某種不同的 - 配置文件/ 1 /資源的嵌套資源,但我喜歡它只是配置文件/ 1/resource =的其他表示)

同樣是使用複數和單數當你有很多資源或一個工作URI,例如

/profile/1.html - gives you 1 resource 
/profiles.html - gives you list of profiles 
+0

嗯,有點。這種方法仍然通過'new'和'edit'包含「操作」,但是將其他冗餘的操作留出。我想這比'DELETE/products/delete/123'等好。 – FtDRbwLXw6 2012-08-07 23:40:51

+0

@drrcknlsn:在ASP.NET MVC中,它將是'/ products/delete/123'的POST。我從來沒有見過任何人在那裏使用DELETE動詞。 – 2012-08-07 23:45:59

+0

@RobertHarvey:這對我來說更令人困惑,因爲除了'DELETE'之外,我不會想用其他任何東西來刪除資源。儘管如此,我理解使用'PUT'的基本原理,如果你想要在URI中包含動作的路由(比GET/products/delete/123或其他任何其他動作更有意義)。 – FtDRbwLXw6 2012-08-07 23:51:03

相關問題