Asp.net mvc 这是PUT幂等的正确实现吗?响应应该是什么?

Asp.net mvc 这是PUT幂等的正确实现吗?响应应该是什么?,asp.net-mvc,api,http,rest,put,Asp.net Mvc,Api,Http,Rest,Put,到目前为止,我对幂等性的理解基本上是这样的:如果我向服务器发送10个相同的PUT,那么所创建的额外资源将与发送一个PUT语句相同 我的意思是,以下实施将坚持这一点: [AcceptVerbs(HttpVerbs.Put)] ContentResult User(){ //parse XML that was sent to get User info //User has an e-mail address which is unique to the system

到目前为止,我对幂等性的理解基本上是这样的:如果我向服务器发送10个相同的PUT,那么所创建的额外资源将与发送一个PUT语句相同

我的意思是,以下实施将坚持这一点:

[AcceptVerbs(HttpVerbs.Put)]
ContentResult User(){

     //parse XML that was sent to get User info
     //User has an e-mail address which is unique to the system
     //create a new user in the system only if one for this e-mail address does not exist

     return Content(something, "text/xml");
}
现在,如果我为用户数据发送了10个包含XML的PUT,并且它们都包含相同的电子邮件地址,那么只会创建一个用户

但是,如果他们发送了10个请求(无论出于何种原因),但它们都不同,但电子邮件是相同的,该怎么办。如果第一个请求未通过,则第二个请求的数据将用于创建用户,并且将忽略以下8个请求。这里有缺陷吗?或者,我应该直接忽略在各个方面都完全相同的请求,而不是返回一个错误,如果它们使用相同的电子邮件地址,则表明用户已经存在


此外,此类PUT声明应发送何种响应?关于用户的信息?也许需要一个ID来使用其他API调用来操作它们?或者它应该只说“success”或“fail:[错误详细信息]”?

如果用户已经使用相同的电子邮件地址存在,那么第二次和后续PUT操作应该更新该资源的数据。成功或失败应在状态代码中传达。如果更新成功,则以“200 OK”或“204 No Content”响应;您可以返回一些信息,但不要期望缓存将其存储为从GET获取的新表示形式。如果您不希望该资源接受除第一个PUT操作之外的其他PUT操作,请使用“405方法不允许”进行响应,并在响应正文中进行解释。如果提交的表示可能会替换资源,但由于其特定字段无法与现有状态协调,因此无法替换,请使用“409冲突”(同样,在响应正文中进行解释)。

您的问题不会显示PUT请求发送到的URL。这实际上非常重要,因为决定是创建新资源还是更新旧资源的不是XML数据中的电子邮件地址,而是发送请求的URL

因此,如果您将PUT发送给/users/john。doe@foo.com/它要么创建用户john。doe@foo.com或者在系统中已经存在时更新它


类似地,如果您将PUT发送到/users/123/(使用id而不是电子邮件),它将创建或更新user 123。但是,在这种情况下,如果电子邮件必须是唯一的,并且有人发送PUT/users/456/并且在该XML中与用户123已有的电子邮件相同,则您必须以409冲突进行响应。

我同意;我认为关键点是用作标识的数据点,在该数据点上可能发生冲突。有趣的是,如果他们正在创建用户,我还不知道ID,但是我仍然不确定检查URL或检查数据是否重要,因为代码中的ID是相同的,如果匹配,就不是新的。