【发布时间】:2014-09-18 09:33:56
【问题描述】:
鉴于其他部门对我们的 REST API 的要求,他们希望将 POST 不仅用于 CREATE,还用于 UPDATE OR CREATE。我知道在 RESTful API 中 PUT 可以或应该用于此目的,但由于客户端必须更新用于构建 URI 的信息,我们不能使用它。它将更改 URI 并使 PUT 不再具有幂等性...(在第一个 PUT 之后旧的 URI 将不存在)。
tl;dr 我们不能使用 PUT
在HTTP/1.1 specs POST 中定义为
POST 方法用于请求源服务器接受 包含在请求中的实体作为资源的新下属 由 Request-URI 标识
还有
POST 方法执行的操作可能不会产生资源 可以通过 URI 识别。
为了保持 RESTful,我会将更新功能解释为删除旧元素,然后创建新元素,这对于 POST 来说是可以接受的功能。
我们会在创建成功时返回#201,在更新时返回#200。
在我们的 API 中,“有可能”在没有 URI 的情况下处理正确的元素(例如,使用 POST 更新它),因为所有 URI 构建主键部分都在资源主体中,因此 API知道客户想要访问哪个元素。
示例
(这只是POST 的行为示例。不适用于资源的数据结构。当然使用PUT 对/cars/ 来说是完全正确的) p>
POST /cars/ HTTP/1.1
<car>
<id>7</id>
<status>broken</status>
</car>
回复:#201
然后
POST /cars/ HTTP/1.1
<car>
<id>7</id>
<status>fine</status>
</car>
回复:#200
现在/cars/7 上的GET 将返回以下内容:
<car>
<id>7</id>
<status>fine</status>
</car>
【问题讨论】:
-
在查看您的示例后,我刚刚删除了我的原始评论,因为您的事务似乎是幂等的。您正在将 7 号车的状态设置为正常。如果您一次又一次地重新运行此方法,那么您仍然会得到相同的结果。因此,没有充分的理由认为这个特定示例不能是 PUT 方法。
-
这个answer 涵盖了我感觉最好的 PUT v POST。如果您的操作是幂等的,则使用 PUT,否则使用 POST。
-
@ydaetskcoR 我认为您的第一条评论很好。该示例仅针对行为(将其添加到问题中)。抱歉含糊不清! :/ 我也看到了你引用的答案,但遗憾的是它并没有真正使用好的资源(PDF 并不是很有帮助)。 Btu 来评论您的最后一条语句 My POST (with Update or Create) 现在有点无能,因为一次又一次地调用它会产生相同的数据集。对于我的解决方案来说,用 PUT 创建这种幂等性似乎是不可能的(因为 uri 发生了变化)
标签: rest http restful-url restful-architecture