小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
翻译自:
问题:HTTP 方法中 POST 和 PUT 的区别是什么呢?他们分别的适用场景是什么呢?
你可以在网上找到这样的断言:
- POST用于创建资源,PUT用于修改资源
- PUT应该用于创建资源,POST应该用于修改资源
其实两者都不完全正确。
更好的方法是根据动作的幂等性在 PUT 和 POST 之间进行选择。
上一篇文章 HTTP 方法中 POST 和 PUT 的区别和适用场景是什么?(一)- 幂等性 介绍了 幂等性(Idempotence) 的概念,说明哪些 HTTP 方法是幂等的,这篇文章会分别对PUT和POST进行分析,最后进行总结。
PUT
PUT 意味着放置资源 - 用不同的内容替换给定 URL 上可用的内容。根据上一篇文章介绍的定义,PUT 方法是幂等的。即不论调用多少次,请求后的对服务端资源状态产生的效果都是相同的。你可以对一个资源进行 PUT 操作,无论它之前是否存在(创建或更新)。
所以,当你指定了资源的新 URL 时,PUT 用于创建一个资源,或者更新它。
新资源:
PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/
覆盖现有资源:
PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/
POST
POST 创建一个子资源,因此 POST 到 /items 会创建一个位于 /items 资源下的资源。例如, /items/1。两次发送相同的 post 数据包将创建两个资源
POST /questions HTTP/1.1
Host: www.example.com/
总结
所以根据上面的分析,当你知道你将创建的事物的 URL 时,PUT 用于创建。当您知道要创建的事物类别的“工厂”或管理这个事物类别的 URL 时,可以使用 POST 来创建。
所以我们可以这样判断:
POST 通过服务端定义的 URL 创建资源。
POST /expense-report
PUT 通过客户端定义的 URL,创建或替换资源。
PUT /expense-report/10929