Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http REST-DELETE真的是幂等的吗?_Http_Rest_Http Headers - Fatal编程技术网

Http REST-DELETE真的是幂等的吗?

Http REST-DELETE真的是幂等的吗?,http,rest,http-headers,Http,Rest,Http Headers,DELETE应该是幂等的 如果我删除它将删除该帐户 如果我再这样做,我会期望404,因为该帐户已不存在?如果我试图删除一个从未存在过的帐户,该怎么办?我认为同样的事情,404-帐户不存在 你可以争辩400个错误的请求。但是在REST的意义上,您请求对其执行操作的对象不存在。这就是404 幂等元与请求的效果有关,而与您得到的响应代码无关 说: 方法也可以具有 “幂等性”(除了 错误或过期问题)的 N>0的副作用相同 请求与单个请求相同 请求 虽然您可能会得到不同的响应代码,但向同一资源发送N+1个

DELETE应该是幂等的

如果我删除它将删除该帐户


如果我再这样做,我会期望404,因为该帐户已不存在?如果我试图删除一个从未存在过的帐户,该怎么办?

我认为同样的事情,404-帐户不存在

你可以争辩400个错误的请求。但是在REST的意义上,您请求对其执行操作的对象不存在。这就是404

幂等元与请求的效果有关,而与您得到的响应代码无关

说:

方法也可以具有 “幂等性”(除了 错误或过期问题)的 N>0的副作用相同 请求与单个请求相同 请求

虽然您可能会得到不同的响应代码,但向同一资源发送N+1个删除请求的效果可以认为是相同的。

幂等性是指请求完成后系统的状态

在所有情况下(除了错误问题-见下文),该帐户不再存在

“方法还可以具有的属性 除了 错误或过期问题 N>0的副作用相同 请求与单个请求相同 请求。方法获取、头、放 和删除共享此属性。另外, 方法选项和跟踪应该 没有副作用,也没有副作用 本质幂等。”


关键是N>0个相同请求的副作用与单个请求相同

您可以正确地预期状态代码会有所不同,但这并不影响幂等性的核心概念-您可以多次发送请求,而无需对服务器的状态进行其他更改。

来自:

方法还可以具有“幂等性”的属性,因为(除了错误或过期问题外)N>0个相同请求的副作用与单个请求相同


注意,这是“副作用”,而不是“反应”。

重要的区别在于幂等元指的是副作用,而不是所有的作用或反应。如果执行
删除操作http://example.com/account/123
那么效果就是账户123现在从服务器上删除了。这是对服务器状态唯一的影响,也是唯一的更改。现在让我们假设您执行相同的
DELETEhttp://example.com/account/123
再次请求时,服务器将做出不同的响应,但其状态相同


它不像删除请求决定以不同的方式更改服务器状态,因为帐户丢失,例如删除另一个帐户或留下错误日志。不,您可以多次调用同一个删除请求,并且可以确保服务器与您第一次调用它时处于相同的状态

是的。不管响应代码是什么

来自(我的):

区分幂等方法是因为请求可以 如果在启动前发生通信故障,则自动重复此操作 客户端能够读取服务器的响应。例如,如果 客户端发送PUT请求,基础连接关闭 在收到任何响应之前,客户端可以建立一个新的 连接,然后重试幂等请求。它知道重复 请求将具有相同的预期效果,即使原始 请求成功,但响应可能不同

它明确表示,反应可能有所不同。更重要的是,它指出了这个概念的原因:如果一个动作是幂等的,那么当它遇到任何错误时,客户端可以重复这个动作,并且知道这样做不会使任何东西崩溃;如果没有,客户端将必须进行额外的查询(可能是
GET
),以查看前一个查询是否有效,然后才能安全地重复该操作。只要服务器能够做出这样的保证,操作就是幂等的。引自:

计算幂等关系到系统的鲁棒性。由于可能出现故障(例如网络中断),当检测到故障时,您如何恢复?最简单的恢复方法是再做一次,但只有当再做一次是幂等的时候,这才有效。例如,
discard(x)
是幂等的,但是
pop()
不是。这都是关于错误恢复的

引自我的:

从历史上看,1999年发布的RFC2616是引用最多的HTTP 1.1规范。不幸的是,这为所有这些辩论留下了空间。但该规范已被RFC 7231取代。引用自,强调矿山:

如果请求方法的预期效果是 具有该方法的多个相同请求的服务器是 与单个此类请求的效果相同。请求方法 由本规范定义的PUT、DELETE和safe请求方法 是幂等的

所以,它写在规范中,幂等性是关于对服务器的影响。第一个DELETE返回204,随后的DELETE返回404,这种不同的状态代码不会使DELETE成为非幂等的。用这个参数来证明随后的204返回是完全不相关的


好的,所以它不是关于幂等性的。但接下来的问题可能是,如果我们在随后的删除中仍然选择使用204,该怎么办?可以吗?

好问题。其动机是可以理解的:允许客户机仍然达到其预期结果,而不必担心错误处理。我想说,在随后的删除中返回204是一个基本无害的服务器端“善意的谎言”,客户端不会立即分辨出区别。这就是为什么有人在野外这样做,而且仍然有效。只要记住,这样
{
    id: "1",
    name: "manchester united",
    city : "manchester "
}
PUT /team/1
{
        id: "1",
        name: "liverpool",
        city : "liverpool"
}