ASP.Net WebAPI - 什么是使用Post和PUT的幂等

时间:2018-03-14 13:36:55

标签: asp.net-web-api

我是新开发者,我对http服务知之甚少。所以我发现了PUT和POST之间的区别。我读了这个https://forums.asp.net/t/2100831.aspx?WebApi+what+is+difference+between+PUT+and+POST

下面的事情不清楚特别是什么是幂等的?

我找到一个人说 - PUT方法被定义为幂等(即:在后续调用中具有相同的结果)。 PUT将始终更新相同的资源并返回200状态代码。

但POST会创建一个新资源并返回201状态代码。

任何人都会介意解释为什么PUT被认为是幂等的。感谢

2 个答案:

答案 0 :(得分:3)

从纯粹的RESTful观点来看,PUT被认为是幂等的,因为无论你做出多少次同样的请求,结果都是一样的。

但是,这就是说,不要忘记您尝试更新的对象可能会在这些相同的PUT请求之间更改其状态,因此您获得的响应可能实际上并不相同。

这并不意味着如果你发出100个PUT请求,只有一个请求通过,就像在之前的响应中一样。

还有一件事,为了清楚起见,POST用于创建新资源,通常返回所创建资源的唯一标识符。

PUT用于更新资源,通常会返回整个更新的资源,以便您可以看到对其进行了哪些更改。

关于每个数据应该接受哪些数据已经有很多讨论,我个人认为POST需要创建资源所需的字段,没有ID,而PUT需要更新字段,如果ID是其中的一部分该URL然后可以再次省略

例如,假设您向端点发出PUT请求,如下所示:

api/users/1 

其中1是您需要识别此用户的ID,那么您的方法可能如下所示:

[HttpPut]
public UserClass Put(int id, UserClass user)
{}

在这种情况下,您的UserClass不需要ID,因为您已经从URL中获取了该ID。

希望所有这些都有意义,我发现在RESTful环境中使用“幂等”非常混乱!

答案 1 :(得分:0)

假设您要更新用户对象,以便以这种方式调用 PutUser 方法

$.ajax({
  url: "yourUrl/PutUser/1",
  type: 'PUT',
  data: "firstName: fName, lastName: lName",
  success: function(data) {
    alert('User Updated.');
  }
});

你的 PutUser 方法看起来像这样

[HttpPut]
public dynamic PutUser(int id, UserClass user)
{}

在这种情况下,如果使用相同的参数1,2 ... 5或N次使Ajax PUT请求结果相同,那就是幂等的意思。

另一方面,如果你有这个

$.ajax({
  url: "yourUrl/PostUser",
  type: 'POST',
  data: "firstName: fName, lastName: lName",
  success: function(data) {
    alert('User Updated.');
  }
});

您的 PostUser 方法看起来像这样

[HttpPost]
public dynamic PostUser(UserClass user)
{}

使用相同的参数调用PostUser方法N次,你会发布N个相同的用户,这可能意味着你的数据库中有100个相同的行,所以你的所有调用都将被处理。