S3 REST API和POST方法

var*_*tec 60 rest amazon-s3 amazon-web-services

我正在使用AWS S3 REST API,在解决了一些令人烦恼的签名问题之后,它似乎有效.但是,当我使用正确的REST动词创建资源时POST,我得到了405 method not allowed.相同的请求与方法一起工作PUT并创建资源.

我做错了什么,或者AWS S3 REST API不完全符合REST标准吗?

Ped*_*eck 224

是的,将CRUD映射到HTTP方法是错误的.

尽管流行的使用和广泛的误解,包括Stack Overflow上的高评价答案,但POST并不是"创建资源的正确方法".其他方法的语义由HTTP协议决定,但POST的语义由目标媒体类型本身决定.POST是用于任何未通过HTTP标准化的操作的方法,因此它可用于创建,但也可用于更新或其他任何尚未通过其他方法完成的操作.例如,使用POST进行检索是错误的,因为你已经为此标准化了GET,但是当客户端由于某种原因不能使用PUT时,使用POST来创建资源是很好的.

同样,PUT不是"更新资源的正确方法".PUT是用于完全替换资源的方法,忽略其当前状态.如果您拥有服务器期望的整个表示,则可以使用PUT进行创建,如果提供完整表示,则可以使用PUT进行更新,包括不会更改的部分,但使用PUT进行部分更新是不正确的,因为您要求服务器考虑资源的当前状态.PATCH是这样做的方法.

在非正式语言中,每种方法对服务器的说法是:

  • POST:获取此数据并将其应用于由给定URI标识的资源,遵循您为资源媒体类型记录的规则.

  • PUT:用这些数据替换给定URI标识的任何内容,忽略已存在的内容,如果有的话.

  • PATCH:如果给定URI标识的资源仍然具有我上次查看时的相同状态,请将此diff应用于它.

请注意,未提及创建或更新,这不是这些方法的语义的一部分.您可以使用POST和PUT创建,但不能创建PATCH,因为它取决于当前状态.您可以使用它们中的任何一个进行更新,但是使用PATCH,您可以根据要更新的状态进行更新,通过替换整个实体来更新PUT,这是一个幂等操作,并且使用POST请求服务器执行它根据预定义的规则.

顺便说一句,我不知道说API是否符合REST是否有意义,因为REST是一种架构风格,而不是规范或标准,但即使考虑到这一点,很少有API谁声称是REST真的是RESTful,在大多数情况下因为它们不是超文本驱动的.AWS S3绝对不是RESTful,尽管它与您的问题有关,但它们对HTTP方法的使用大部分时间都遵循HTTP标准.

  • 很好的解释.POST修改资源.人们感到困惑,因为通过POST来创建一个代表集合的资源来修改集合是很常见的.但是新成员是一个不同的资源,其URL与您发布的URL不同. (2认同)
  • 如果您对 /path/file.name 进行 POST 尝试创建该资源,则绝对是错误的,因为 POST 数据从属于 /path/file.name 资源,如果不存在,则无法执行此操作任何与它有关的东西。理论上,AWS 应该返回 404,而不是 405,但这可能是一个实现细节。它的路由具有允许的方法,并且在检查资源是否实际存在之前检查方法。 (2认同)
  • 围绕REST有很多普遍的误解,这可能是最常见的。不幸的是,Stack Overflow有助于增强其中的许多功能,而且很难找到好的资源。奇怪的是,这里带有REST标签的最热门的问题的投票最多是绝对错误的。 (2认同)
  • 维基百科的那篇文章非常具有误导性,而且质量很差。几乎给出的每个示例都不是 RESTful,包括您引用的部分,并且至少在讨论页面上有一些关于此问题的评论。如果您需要证实我上面所说的任何内容,您应该参考 RFC 2616。 (2认同)

Pre*_*raj 7

+--------------------------------------+---------------------+
|                 POST                 |         PUT         |
+--------------------------------------+---------------------+
| Neither safe nor idempotent Ex: x++; | Idempotent Ex: x=1; |
+--------------------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)