首页 > 解决方案 > Flask:对在 Rest API 中使用 PUT/POST 感到困惑

问题描述

尊敬的长者/程序员/有学问的人,
我在这里阅读了一个非常流行的关于使用 PUT 或 POST 的答案,但我无法从中解读出正确的方法是什么。几乎每个答案都有评论说这是错误的/这是正确的。此处大惑不解。
我的要求:
向服务器发送 2 个 Json 文件,一个要插入数据库,另一个要更新。我以为我会使用 PUT 进行更新,然后使用 POST 插入数据库。这样,在客户端本身我会决定是插入还是更新。

困惑:由于客户端单独负责在服务器上创建/更新其数据,因此即使在我的情况下,重复的 POST 也会insert into table values一遍又一遍地插入相同的东西(),表现为幂等或会给出错误(因为主键冲突)。最后,它不会在发射两次后产生新的东西。

问题:使用 PUT 进行更新和 POST 插入是否正确?

标签: restpython-requestsflask-restful

解决方案


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了这个问题。


推荐阅读