【问题标题】:Should I use Post or Put to edit a person in a database and which should I use to add a new person?我应该使用 Post 还是 Put 来编辑数据库中的一个人,我应该使用哪个来添加一个新人?
【发布时间】:2012-06-18 17:59:59
【问题描述】:

下面是这个方法现在的样子:

POST person/personId/edit
https://api.example.com/*key*/person/*personId*/edit?FName=Blah

我希望这将 personId 中的人的名字更改为 Blah。

如果我需要添加一个人,我会说:

PUT person/create
https://api.example.com/*key*/person/create

它会添加一个具有新 personId 的人。

【问题讨论】:

    标签: database api rest post put


    【解决方案1】:

    一般的约定通常是:

    GET    => READ
    POST   => CREATE
    DELETE => DELETE
    PUT    => UPDATE
    

    我可以看到的一个区别是您还使用了不同的 URI,最常用的是单个资源 URI。但是,无论如何,这是有争议的,所以这是你喜欢它的问题。

    【讨论】:

    • @wizage,在 lanzz 的评论之后,我意识到你已经把它交换了。
    • 从问题看来,@wizage 使用 POST 进行更新,使用 PUT 进行创建,这与答案不同。
    • @wizage 我只是评论你的方法和答案的方法之间的区别。 对我而言,使用 PUT 创建并使用 POST 更新似乎更合乎逻辑;但是,Wikipedia 在示例中也使用 PUT=update POST=create。
    • 可能推理是关于idempotence of the PUT method,而POST不需要是幂等的。
    • PUT 不是更新,而是替换,这是一个强烈的语义差异。我意识到这篇文章的年代,但部分实体更新应该更合适地实现为补丁。我认为您将在现场看到的大多数事情都将 POST 和 PUT 都用作不同情况下的更新,但这也是为什么这些 API 往往非常不一致和令人困惑并且不适合 REST imo
    【解决方案2】:

    我对 POST 和 PUT 的理解一直是:

    POST - 服务器将收到一个实体,它可以用来执行操作或创建资源。如果端点的意图是创建一个资源,那么 POST 将始终创建一个 NEW 资源。在任何情况下,每个 POST 都会被处理而不考虑资源的状态。您只是将信息发布到服务器以供其操作。

    例子:

    • 想象一下将向用户手机发送消息的 Web 服务。 POST 可用于向服务器提供可能不适合 GET 的必要信息。请求有效负载将包含此信息。服务器上没有创建资源,所以操作返回200 OK,表示操作成功完成。响应还可能包含一个正文,其中包含来自服务器操作的信息。
    • 想象一个 Web 服务创建一张张贴在公告板上的票。 POST 可以包含发布该帖子所需的信息。该信息被保存在服务器上并返回一个 201 Created(可能是一个包含用户 ID 的响应正文,或者由创建产生的更完整的对象)。在所有情况下,当将某些内容发布到此端点时,都会创建一个新票证。

    PUT - 服务器将接收一个实体(例如带有 ID),以创建或替换资源。如果资源已经存在,则将其替换为请求中的资源,否则将创建一个新资源。在所有情况下,服务器上都会保留一些内容。必须提供某种唯一标识实体的方法。换句话说,客户端是创建 ID 的人,因为如果需要创建实体,将使用它。我认识的大多数人都在为这个现实而苦恼。

    例子:

    • Web 服务从包含用户的客户端接收有效负载 信息。期望是用户将被保存。这 服务器将检查该用户是否存在。如果是的话,它会 通过(全部)替换该用户来更新该用户 请求并返回 200 OK 或 204 No Content。如果没有 存在,它会创建它并返回 201 Created。

    【讨论】:

      猜你喜欢
      • 2015-11-16
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      相关资源
      最近更新 更多