Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
RESTAPI中的Put VS Post VS Delete_Rest - Fatal编程技术网

RESTAPI中的Put VS Post VS Delete

RESTAPI中的Put VS Post VS Delete,rest,Rest,我对RESTAPI中的Http方法有疑问。我在互联网上读了很多关于这方面的文章,我们可以使用Put来创建或更新资源,使用Post来创建资源,使用Delete来删除资源。 但我是说这是强制性的吗?因为当我们编写代码时,我们只会像put、Post和Delete那样放置注释,但是如果我使用Delete注释,在side方法中我做一些其他事情,假设我编写add逻辑而不是Delete,那么会发生什么呢?我想我可以这样做,类似于其他方法(Post和put)。那么这些注释的意义是什么。如果我能做到我上面提到的,

我对RESTAPI中的Http方法有疑问。我在互联网上读了很多关于这方面的文章,我们可以使用Put来创建或更新资源,使用Post来创建资源,使用Delete来删除资源。 但我是说这是强制性的吗?因为当我们编写代码时,我们只会像put、Post和Delete那样放置注释,但是如果我使用Delete注释,在side方法中我做一些其他事情,假设我编写add逻辑而不是Delete,那么会发生什么呢?我想我可以这样做,类似于其他方法(Post和put)。那么这些注释的意义是什么。如果我能做到我上面提到的,就意味着为add-in Delete Annotation编写逻辑,那么对于我来说Delete只是一种请求,我可以为add或update编写任何逻辑

类似地,我读的Put是幂等的,但如果我写的是add逻辑而不是update,那么它就不是幂等的

也许我在这里可能是错的。请澄清这一点。这给我带来了困惑,没有地方解释它,每个地方都有一般性的陈述

谢谢和问候

阿弥陀佛·潘迪

我是说这是强制性的吗

不是强制性的,不是

Roy Fielding在以下方面进行了有趣的观察:

HTTP并不试图要求GET的结果是安全的。什么 它确实要求操作的语义是安全的

其他方法也是如此——我们都同意请求消息的含义(语义),因为这就是标准(RFC 7230等)中的含义。所以PUT总是意味着“请用我提供的表示替换目标资源的当前表示”,但是您的实现如何处理该消息取决于您

当然,如果您的实现令人惊讶,那么有一个重要的警告:

如果发生任何导致财产损失的情况,这是实现的错误,而不是接口或该接口的用户的错误

REST的要点是,通用组件可以通过统一接口与您的资源交互。如果您的实现与统一接口不匹配,那么是您的bug,而不是组件中的bug,“不正常工作”

我读Put是幂等的,但如果我写add逻辑而不是update,那么它就不是幂等的

PUT的语义是。如果PUT请求的处理程序不是幂等的,那么您犯了一个错误,并且您的实现有一个错误。如果通用组件需要发送多个PUT消息(例如,因为响应在不可靠的网络上丢失),则该故障将成为故障

“添加逻辑”当然不一定是幂等的——可以考虑在字典中添加一个键和值;如果添加两次相同的键,则与添加一次键相同

d = {}
d[k] = v
d[k] = v # idempotent, because this is a no-op

e = {k:old}
if e[k] == old:
    e[k] == new:
if e[k] == old: # Again, idempotent, because the second copy of the message is a no-op
    e[k] == new 

如果有人发送PUT请求,而您无法确保幂等语义,那么应该返回一个,并确保您对的响应不会声明该资源支持PUT。

REST是一个协议-您是否坚持该协议是您的决定,但是,如果您遵从协议,不要期望其他人能够与您的应用程序通信。为了简单起见,“HTTP”是英语,“REST”是进出房屋的协议。当然,你可以发明一个协议,其中“我可以离开你的房子”意味着“我可以进来吗”和“我可以进入你的房子”意味着“出口在哪里”,但我保证你和你的客人之间会有很多困惑。感谢Smutje以最好的例子对你的澄清。