REST uri用于POST和返回(GET)

时间:2010-10-07 17:24:53

标签: asp.net wcf rest

抱歉这个奇怪的标题。这是我的情况。

我有一张产品表,其中包含每种产品的名称和显示顺序。客户可以更改产品的显示顺序。该表是使用jQuery.tmpl生成的,并且在WCF下使用GET提取数据。从数据库中提取的产品是按类别ID。

当用户更改网格中产品的显示顺序时,需要使用POST更新产品。数据更新后,服务器需要发回更新的json对象以更新表。

问题:如何为这种情况构建我的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调用。

不确定这是否“正确”。那些餐馆的人让我吓坏了!

感谢。

更新 我开始考虑上面的代码,并意识到还有更多的事情发生在这里。 我的情况是,我正在尝试按产品ID更新特定产品,然后按类别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

此问题已通过Daniel提供的链接here得到解决。尽管在一个POST调用中处理所有内容似乎都有意义,但我认为它不符合REST的精神并使用Uri作为资源。使用POST然后使用GET调用似乎就是答案。感谢Daniel。他的评论很好。

1 个答案:

答案 0 :(得分:1)

更新显示顺序的POSTPUT请求不应返回任何内容,但指示请求状态的状态代码除外。您应该发出单独的GET请求以接收前15/25/50 / etc产品的新列表:

  

如果创建了新资源,源服务器必须通知用户代理      通过201(创建)回复。如果修改了现有资源,      应该发送200(OK)或204(No Content)响应代码      表示请求成功完成。如果资源      无法使用Request-URI创建或修改      错误回应应该给出反映出来的性质      问题

     

来自:HTTP 1.1 Specification

的第9.6节

您可能还有兴趣查看HTTP Spec(第9.5和9.6节)以及以下Stack Overflow帖子:


那就是说,我可以想到两种方法来更新产品的显示顺序:

  1. 发送特定product_id的上移或下移请求。只要单击向上/向下按钮,就可以调用此请求。

  2. 发送整个类别的完整order_rank列表。

  3. 我相信后者更实用,但您可能希望公开这两种操作。对于第一种方法,POST动词似乎是合适的,但对于第二种方法,我会使用PUT

    对于第一种方法,我会想象如下的URI:

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

    以上表明我们正在创建一个“向上移动”或“向下移动”命令。动词POST表示“创建”,名词(动作)是“向上移动”或“向下移动”命令,它作用于特定的product_id。

    对于第二种方法,我会看到如下的URI:

    PUT /categories/{categoryId}/order-rank
    

    我们可以使用order_rank编号为每个product_id传递JSON / XML / etc表示。动词PUT表示“更新”,名词是特定category_id的“顺序等级”。