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 | PUT |
+--------------------------------------+---------------------+
| Neither safe nor idempotent Ex: x++; | Idempotent Ex: x=1; |
+--------------------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70132 次 |
最近记录: |