1

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

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

对于更新,我再次传递带有所有参数的用户实例。该服务为具有给定 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 已经存在于用户实例中。

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

4

2 回答 2

3

PUT,作为幂等操作,应该在您要 PUT 的 URL 上创建一个新资源,或者完全替换现有资源(在此处放置此资源)。如果您多次对同一个 URL 执行相同的 PUT,您仍然会得到相同的资源。

POST 不一定是幂等的,因为您正在更改现有资源。如果您的 POST 正在执行诸如向订单添加商品之类的操作,并且您将相同的数据多次发布到相同的 url,您最终可能会得到一个包含多个相同商品的订单。

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

我认为这个 SO Answer很好地解释了它。

于 2011-02-03T13:32:15.657 回答
1

您可以通过几种方式查看它

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

所以我想说:

  • 添加用户: /Users 和 POST (但是理论上你可以用 PUT 来代替)。
  • 使用 PUT 更新用户:/Users/{userId}

然后是使用 GET 获取用户信息 /Users/{userId} ...或使用 Delete 删除用户 /Users/{userId}。

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

于 2011-02-03T13:29:46.783 回答