插入和更新的URI约定 - WCF Rest API

时间:2011-02-03 13:13:43

标签: c# wcf crud wcf-rest

我有User的用户集合。用户 - Id,FName,LName。

对于insert,我使用Id,FName,LName传递User实例。如果用户不存在,该服务会插入用户。

对于更新,我再次使用所有参数传递User实例。该服务使用给定的Id更新用户的FName和LName。

我希望在服务中插入和更新为2个单独的方法。

我不能为这两种方法使用相同的URI。如下所示:

    [WebInvoke(UriTemplate = "Users", Method = "PUT")]
    void  UpdateUser(User instance);

    [WebInvoke(UriTemplate = "Users", Method = "PUT")]
    void  AddUser(User instance);

实现这一目标的最佳途径是什么?

我不同意一篇帖子说更新URI有类似的内容:

    [WebInvoke(UriTemplate = "Users/{userId}", Method = "PUT")]
    void  UpdateUser(string userId, User instance);

因为用户ID已存在于Userinstance中。

虽然我同意PUT方法可以执行插入和更新。出于某种原因,我需要将它们分开。

2 个答案:

答案 0 :(得分:3)

PUT,作为idempotent操作应该在您正在PUT或完全替换现有资源的URL上创建一个新资源(在此处输入此资源)。如果您多次对相同的URL执行相同的PUT,您仍将使用相同的资源。

POST不一定是幂等的,因为您正在更改现有资源。如果你的POST正在做一些事情,比如在订单中添加项目,并且将相同的数据发布到同一个url多次,那么最终可能会得到一个包含同一项目的倍数的订单。

简短回答,让您的插入操作PUT并更新POST。

我认为this SO Answer能够很好地解释它。

答案 1 :(得分:1)

你可以通过几种方式看待它

  • PUT - 用于更新,但如果提供的ID不存在则插入
  • POST - for 创建,插入次数 即使您传递相同的数据也喜欢 多次因为它忽略了ids

所以我会说:

  • 添加用户:/具有POST的用户(但是你可以用理论上的PUT来做这件事。)
  • 使用PUT
  • 更新用户:/ Users / {userId}

然后通过GET获取用户信息/ Users / {userId}或删除用户/ Users / {userId}并删除。

不确定这是否有帮助,如果没有,请告诉我,我会再试一次: - )