2010-10-07 94 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