s3restapi和POST方法
我正在使用,在解决了一些恼人的签名问题后,它似乎起了作用。然而,当我使用正确的REST动词来创建资源时,即s3restapi和POST方法,rest,amazon-web-services,amazon-s3,Rest,Amazon Web Services,Amazon S3,我正在使用,在解决了一些恼人的签名问题后,它似乎起了作用。然而,当我使用正确的REST动词来创建资源时,即POST,我得到了405方法notallowed。同样的请求可以在方法PUT中正常工作,并创建资源 是我做错了什么,还是AWS S3 REST API不完全兼容REST?是的,您在将CRUD映射到HTTP方法时出错了 尽管普遍使用和广泛的误解,包括这里关于堆栈溢出的高分答案,POST并不是“创建资源的正确方法”。其他方法的语义由HTTP协议决定,但POST的语义由目标媒体类型本身决定。POS
POST
,我得到了405方法notallowed
。同样的请求可以在方法PUT
中正常工作,并创建资源
是我做错了什么,还是AWS S3 REST API不完全兼容REST?是的,您在将CRUD映射到HTTP方法时出错了 尽管普遍使用和广泛的误解,包括这里关于堆栈溢出的高分答案,POST并不是“创建资源的正确方法”。其他方法的语义由HTTP协议决定,但POST的语义由目标媒体类型本身决定。POST是用于任何未被HTTP标准化的操作的方法,因此它可以用于创建,也可以用于更新,或者其他一些方法尚未完成的任何操作。例如,使用POST进行检索是错误的,因为您已经对此进行了标准化,但是当客户端由于某种原因无法使用PUT时,使用POST创建资源是可以的 同样,PUT也不是“更新资源的正确方法”。PUT是用于完全替换资源的方法,忽略其当前状态。如果您拥有服务器预期的整个表示,您可以使用Poto来创建,如果您提供了完整的表示,则可以使用Poto进行更新,包括您不会更改的部分,但是使用PUT进行部分更新是不正确的,因为您要求服务器考虑资源的当前状态。补丁是实现这一点的方法 在非正式语言中,每个方法对服务器说的是:
- POST:按照您为资源媒体类型记录的规则,获取此数据并将其应用于给定URI标识的资源
- PUT:用此数据替换给定URI标识的内容,忽略其中已有的内容(如果有的话)
- 补丁:如果给定URI标识的资源仍与上次查看时的状态相同,请对其应用此差异
IMO PUT可用于创建或修改/替换封闭实体。很好的解释。POST修改资源。人们会感到困惑,因为发布到表示集合的资源以通过创建新成员来修改集合是很常见的。但是新成员是一个不同的资源,与您发布到的资源有不同的URL。有趣的是,我不知道,我检查过的大多数资源都谈到将CRUD映射到POST、GET、PUT和DELETE。尽管我发现一些声明是POST to
/someobjects/
而不是PUT to/someobjects/identifier
。这就是为什么S3API会抱怨的原因,因为我正在发布到/path/file.name
。如果您正在发布到/path/file.name试图创建该资源,那么这肯定是错误的,因为发布数据从属于/path/file.name资源,如果不存在,它将无法处理它。理论上,AWS应该返回404,而不是405,但这可能是一个实现细节。它的路由具有允许的方法,并且在检查资源是否实际存在之前检查方法
+--------------------------------------+---------------------+
| POST | PUT |
+--------------------------------------+---------------------+
| Neither safe nor idempotent Ex: x++; | Idempotent Ex: x=1; |
+--------------------------------------+---------------------+