S3 REST API和POST方法
我正在使用AWS S3 REST API,并且在解决了一些令人讨厌的签名问题之后,它似乎可以正常工作。 但是,当我使用正确的REST动词创建资源时,即POST
,我得到405 method not allowed
。 相同的请求与方法PUT
正常工作并创建资源。
我做错了什么,或者AWS S3 REST API不完全符合REST?
是的,你在将CRUD映射到HTTP方法时是错误的。
尽管广泛使用和广泛的误解,包括Stack Overflow的高分答案,POST并不是“创建资源的正确方法”。 其他方法的语义由HTTP协议确定,但POST的语义由目标媒体类型本身决定。 POST是用于任何未通过HTTP标准化的操作的方法,因此它可用于创建,但也可用于更新或其他任何尚未通过其他方法完成的任何操作。 例如,使用POST进行检索是错误的,因为你已经为此标准化了GET,但是当客户端由于某种原因无法使用PUT时,使用POST创建资源是很好的。
以同样的方式,PUT不是“更新资源的正确方法”。 PUT是用于完全替换资源的方法,忽略其当前状态。 如果您具有服务器期望的整个表示形式,则可以使用PUT进行创建,如果提供完整表示形式(包括不会更改的部分),但可以使用PUT进行更新,但使用PUT进行部分更新不正确,因为你要求服务器考虑资源的当前状态。 补丁是这样做的方法。
在非正式语言中,每种方法对服务器所说的是:
POST :获取此数据并将其应用于由给定URI标识的资源,遵循您为资源媒体类型记录的规则。
PUT :用这些数据替换给定的URI所标识的任何内容,如果有的话,忽略已经存在的内容。
补丁 :如果由给定URI标识的资源仍然具有上次查看时的相同状态,请将此差异应用于此补丁 。
请注意,未提及创建或更新,也不是这些方法的语义的一部分。 您可以使用POST和PUT创建,但不能创建PATCH,因为它取决于当前状态。 你可以用它们中的任何一个进行更新,但是对于PATCH,你有一个更新条件来更新状态,PUT通过替换整个实体来进行更新,所以它是一个幂等操作,并且通过POST请求服务器执行它根据预定义的规则。
顺便说一下,我不知道说API是否符合REST标准是合理的,因为REST是一种架构风格,而不是规范或标准,但即使考虑到这一点,只有极少数API声称是REST的真的很RESTful,在大多数情况下,因为它们不是超文本驱动的。 AWS S3绝对不是RESTful,尽管它对您的问题有影响,但大多数时候,它们对HTTP方法的使用遵循HTTP标准。
+--------------------------------------+---------------------+
| POST | PUT |
+--------------------------------------+---------------------+
| Neither safe nor idempotent Ex: x++; | Idempotent Ex: x=1; |
+--------------------------------------+---------------------+
在原始HTTP规范中,POST请求的有效负载中给出的资源“被认为是从属于指定的对象”(即请求URL)。 TimBL之前曾经说过(无法找到参考),它是使用NNTP中的同名命名方法建模的。
链接地址: http://www.djcxy.com/p/1923.html