抱歉这个奇怪的标题。这是我的情况。
我有一张产品表,其中包含每种产品的名称和显示顺序。客户可以更改产品的显示顺序。该表是使用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。他的评论很好。
答案 0 :(得分:1)
更新显示顺序的POST
或PUT
请求不应返回任何内容,但指示请求状态的状态代码除外。您应该发出单独的GET
请求以接收前15/25/50 / etc产品的新列表:
如果创建了新资源,源服务器必须通知用户代理 通过201(创建)回复。如果修改了现有资源, 应该发送200(OK)或204(No Content)响应代码 表示请求成功完成。如果资源 无法使用Request-URI创建或修改 错误回应应该给出反映出来的性质 问题
的第9.6节
您可能还有兴趣查看HTTP Spec(第9.5和9.6节)以及以下Stack Overflow帖子:
那就是说,我可以想到两种方法来更新产品的显示顺序:
发送特定product_id的上移或下移请求。只要单击向上/向下按钮,就可以调用此请求。
发送整个类别的完整order_rank列表。
我相信后者更实用,但您可能希望公开这两种操作。对于第一种方法,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的“顺序等级”。