rest - Flask:对在 Rest API 中使用 PUT/POST 感到困惑
问题描述
尊敬的长者/程序员/有学问的人,
我在这里阅读了一个非常流行的关于使用 PUT 或 POST 的答案,但我无法从中解读出正确的方法是什么。几乎每个答案都有评论说这是错误的/这是正确的。此处大惑不解。
我的要求:
向服务器发送 2 个 Json 文件,一个要插入数据库,另一个要更新。我以为我会使用 PUT 进行更新,然后使用 POST 插入数据库。这样,在客户端本身我会决定是插入还是更新。
困惑:由于客户端单独负责在服务器上创建/更新其数据,因此即使在我的情况下,重复的 POST 也会insert into table values
一遍又一遍地插入相同的东西(),表现为幂等或会给出错误(因为主键冲突)。最后,它不会在发射两次后产生新的东西。
问题:使用 PUT 进行更新和 POST 插入是否正确?
解决方案
PUT
也可用于创作。重要的是网址。这通常是公认的模式:
PUT /collection/1234 <- Update a specific item OR create it
POST /collection <- Add a new item to a collection
哪一个适合您取决于几件事。服务器确定新项目的 url,还是客户端确定?
如果客户端可以弄清楚新项目的 url 变成了什么,使用PUT
可能会更好,因为您可以更轻松地将其转换为幂等请求。
请记住,PUT
请求的意图始终是您将目标 url 处的资源替换为新状态。
但是,如果服务器创建了 url 模式(也许你有一个自动递增的 id),那么 POST 会更好。POST 不必在父集合上,但它很常见。
如果你想要POST
并且想要幂等性,你需要一些其他的方法来找出某个东西是一个重复的请求。您可以通过PUT
. 例如,Stripe API通过添加非标准标头解决Idempotency-Key
了这个问题。
推荐阅读
- html - HTML如何对齐文本中心,并以一定的边距对齐?
- versioning - 如何使用同一个 Chrome 网上应用店来托管同一个 Chrome 扩展程序的多个版本
- javascript - 验证多部分表单的每个部分
- javascript - 未捕获的 ReferenceError: postscribe 未在 ctkvidinit ((index):3258) 处定义
- javascript - 如何在多个 z-index 图层中正确渲染带有 html2canvas 的图像?
- python-3.x - TensorFlow 保存和恢复到新的会话/图表
- java - Spring bean 类型定义不明确且缺少配置
- arrays - *ngFor 数据不显示
- python-3.6 - 多个客户端的 Paramiko ssh.close() 问题
- excel - 检查每一行中的一列并捕获每个唯一值并分配给一个变量