Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
s3restapi和POST方法_Rest_Amazon Web Services_Amazon S3 - Fatal编程技术网

s3restapi和POST方法

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

我正在使用,在解决了一些恼人的签名问题后,它似乎起了作用。然而,当我使用正确的REST动词来创建资源时,即
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标识的资源仍与上次查看时的状态相同,请对其应用此差异

请注意,没有提到create或update,也不是这些方法语义的一部分。您可以使用POST和PUT创建,但不能使用PATCH,因为它取决于当前状态。您可以使用它们中的任何一个进行更新,但是使用PATCH,您有一个更新条件,该更新条件是您要从中更新的状态;使用PATCH,您可以通过替换整个实体进行更新,因此这是一个幂等操作;使用POST,您可以要求服务器根据预定义的规则进行更新

顺便说一句,我不知道说一个API是否符合REST是否有意义,因为REST是一种体系结构样式,不是规范或标准,但即使考虑到这一点,声称是REST的API很少是真正的RESTful,在大多数情况下,因为它们不是。AWS S3绝对不是RESTful,尽管它与您的问题有关,但它们对HTTP方法的使用在大多数情况下都遵循HTTP标准。

在中,POST请求的有效负载中提供的资源“被视为从属于指定的对象”(即请求URL)。TimBL之前说过(找不到参考资料)它是模仿的。

添加到@Nicholos

帖子:

发布的实体从属于URI,其方式与 文件从属于包含它的目录,则新闻文章是 从属于发布到的新闻组,或记录是 从属于数据库

POST方法执行的操作可能不会生成资源 可以由URI标识的。在这种情况下,200(正常)或204 (无内容)是适当的响应状态,具体取决于 响应是否包含描述结果的实体

如果已在源服务器上创建资源,则响应 应为201(已创建)

PUT:

PUT方法要求将封闭的实体存储在 提供的请求URI。如果请求URI引用已存在的 资源,则应将封闭的实体视为已修改的实体 位于源服务器上的版本。如果请求URI 不指向现有资源,并且该URI能够 请求用户代理将其定义为新资源 源服务器可以使用该URI创建资源。如果有新的资源 创建时,源服务器必须通过201通知用户代理 (创建)响应。如果修改了现有资源,则 应发送200(正常)或204(无内容)响应代码以指示 成功完成请求


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; |
+--------------------------------------+---------------------+