2010-10-07 108 views
3

對不起,奇怪的標題。這是我的情況。REST uri POST和返回(GET)

我有一個產品表,每個產品的名稱和顯示順序。客戶可以改變產品的顯示順序。該表是使用jQuery.tmpl生成的,並且在WCF下使用GET來拉取數據。從db中取出的產品是通過CategoryID。

當用戶更改網格中產品的顯示順序時,需要使用POST更新產品。數據更新後,服務器需要發送更新的json對象來更新表。

問題:如何爲此場景構建POST POST uri?這是我現在擁有的。

[OperationContract] 
     [WebInvoke(
      Method = "POST", 
      RequestFormat = WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "product/form/{categoryId}")] 
     [return: MessageParameter(Name = "products")] 
     List<Product> UpdateProduct(string categoryId); 

我相信我的uri更新資源是正確的,因爲我通過分類id更新單個產品。但是,我想根據POST所做的更改返回一組新的產品,而不必進行單獨的GET調用。

不確定這是否「正確」。那些咖啡師讓我驚慌失措!

謝謝。

UPDATE 我開始考慮更多關於我上面的代碼,並意識到這裏還有更多。 我的情況的現實情況是,我試圖通過ProductID更新特定產品,然後按類別ID返回產品列表。本質上是一個POST和一個GET。那麼我的URI會是這樣嗎?

[WebInvoke(
Method = "POST", 
UriTemplate = "product/form/{productId}/products/{categoryId}")] 
[return: MessageParameter(Name = "products")] 
List<Product> UpdateProduct(string productId, string categoryId); 

用我這樣的方法?

public static List<Product> UpdateProduct(string productId, string categoryId) 
{ 
ProductManager.UpdateProduct(int.Parse(productId)); 
return ProductManager.GetProducts(int.Parse(categoryId)); 
} 

UPDATE2

這個問題已經與丹尼爾提供的鏈接地址here。儘管在一次POST調用中處理所有事情似乎是有道理的,但我認爲它不符合REST的精神並將Uri用作資源。使用POST然後GET調用似乎是答案。感謝丹尼爾。他的評論很好。

回答

1

A POSTPUT更新顯示順序的請求不應返回任何內容,除了指示請求狀態的狀態碼。你應該發出一個單獨的GET接收請求的前15/25/50 /等產品的新名單:如果創建了一個新的資源

,原始服務器必須通過201(創建通知用戶代理 )的迴應。如果現有資源被修改, 或者200(OK)或204(無內容)響應代碼應該被髮送 以指示請求的成功完成。如果無法使用Request-URI創建或修改資源 ,則應給出適當的 錯誤響應,以反映 問題的性質。

來自:第9節。的HTTP 1.1 Specification

6您還可能有興趣在檢查出HTTP Spec(第9.5和9.6)和下面的堆棧溢出後:


那說,我可以想出兩種方法來更新產品的顯示順序:

  1. 發送特定product_id的上移或下移請求。只要點擊上/下按鈕,就可以調用該請求。

  2. 發送整個類別的完整order_rank列表。

我相信後者更實用,但是您可能想要公開兩個操作。對於第一種方法,POST動詞似乎是適當的,但對於第二種,我會使用PUT

對於第一種方法,我會想象的URI像下面這樣:

POST /products/{productId}/move-up 
POST /products/{productId}/move-down 

以上表明,我們正在創建一個「移動式」或「移動向下」的命令。動詞POST表示「創建」,名詞(動作)是「上移」或「下移」命令,它作用於特定的product_id。

對於第二個方法中,我會看到一個URI類似如下:

PUT /categories/{categoryId}/order-rank 

爲了使我們可以通過一個JSON/XML /等表示用於與order_rank數每PRODUCT_ID。動詞PUT表示「更新」,名詞是特定category_id的「order-rank」。

+0

嗨丹尼爾。在我的情況下,顯示順序是我的產品表中的一列。這對我的應用程序是必需的。如果我正確理解你,你建議2個電話來執行這個操作? – trevorc 2010-10-07 18:02:33

+0

@ user423311:不,只有一個電話是你建議的。基本上,我只指出了不同的URI結構。 – 2010-10-07 18:07:58

+0

好的。所以我發佈的一般前提是可以的,因爲我是PUT/POST(更新)到更新uri,但也返回了來自該更新uri的一組數據。 FYI我選擇POST是因爲我閱讀@ http://www.roberthahn.ca/articles/2007/04/06/url-design/和@ http://jcalcote.wordpress.com/2008/10/16/放置或者發佈其餘的故事/ – trevorc 2010-10-07 18:17:10