【问题标题】:REST API - To PUT or to POST? [duplicate]REST API - PUT 还是 POST? [复制]
【发布时间】:2012-07-18 11:46:48
【问题描述】:

可能重复:
PUT vs POST in REST

我知道这已经讨论了很多,虽然我有点明白,但我并不完全明白。我认为如果有人可以就以下示例回答这个问题,那将很容易理解。

创建新用户 - 将新用户添加到发送用户名、密码、电子邮件的数据库中。 PUT 还是 POST?

我想可能是 PUT,因为我不想拥有重复的用户,而 PUT 就像删除和替换一样。但是,我有避免用户被添加两次的检查,所以也许我应该使用 POST?

更新用户 - 更改电子邮件或密码。 PUT 还是 POST?

我可以使用 URI api/update/my_username 然后通过正文发送新电子邮件,所以这应该是 PUT 吗?我也可以在 URI 中发送它,例如api/update/my_username/email/new_email@email.com

【问题讨论】:

    标签: rest


    【解决方案1】:

    创建 - POST,更新 - PUT,删除 - DELETE。

    为了更好地理解 HTTP 动词的用法,请查看 RFC https://www.rfc-editor.org/rfc/rfc2616

    PUT 请求也可以创建实体,但响应代码应该是 201 创建而不是 200 OK 和 204 No Content。但这取决于您是否允许/实施此类行为。

    【讨论】:

    • 我认为电子邮件是在正文中还是在 uri 中并不重要,至少在安全性方面不重要。如果您可以阅读标题,则可以阅读正文。
    • 在第一次阅读 REST 时,我决定创建 - 发布、更新 - 放置、删除 - 删除,但它似乎没有那么简单。 jcalcote.wordpress.com/2008/10/16/…
    • @Paul Benbow 是的,这不是那么简单,有细微差别,这就是为什么我附上了 RFC 的链接(所有细微差别都在那里描述),但是 Post、put、delete、get 都很好,在大多数情况下,映射到 CRUD 操作。而且没有必要寻找更难的方法。
    • @Thor84no 是的,这没关系,但是当电子邮件通过 URI 发送时,即使使用 HTTPS,也可以嗅探它们
    • Uri 中没有电子邮件与主要问题无关。所以再来一次:post-create,当你没有实体 id 时,put - update,当你有实体和 id 时,但它可以创建嵌套实体。
    【解决方案2】:

    关键指南是操作是否是幂等的,即如果你重复它会发生什么。如果总体上发生相同的事情(忽略日志、上次更改时间和其他琐事),无论您执行一次、两次还是 20 次请求,它都是幂等的,应该是 PUT。如果您执行的次数很重要,请使用 POST。

    创建通常是非幂等的,因为您通常会向用户发出一个 ID,但它必须是那样的(例如,如果调用者指定了 ID)。更新通常是幂等的,因为在实践中将数据字段更改为其当前值通常是一种有效的空操作。

    【讨论】:

    • “关键指南是操作是否是幂等的” - 我发布创建一个新用户但放入规则以阻止重复的电子邮件和用户名然后它变得幂等因为规则不是吗?
    • 如果您有阻止重复电子邮件等的规则,违反这些规则应该会改变结果。在第一个 CREATE 你应该得到一个新实体创建和一个 200 OK 响应作为结果,在随后的那些你希望没有创建实体(不同的结果)和一个 400 BAD REQUEST(带有错误消息),因此它仍然不是幂等的。
    • Thor84no - 好的,我了解创建用户场景。那么只更新现有用户的电子邮件地址?如果我继续使用更新的电子邮件发出相同的请求,则发送相同的更新电子邮件时不会发生任何变化,因此它是幂等的,因此是 PUT。
    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 2015-01-25
    • 2014-11-06
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2019-09-15
    • 2019-07-18
    相关资源
    最近更新 更多