【发布时间】:2011-09-06 09:21:26
【问题描述】:
在 RESTful 风格的编程中,我们应该使用 HTTP 方法作为我们的构建块。虽然哪些方法与经典的 CRUD 方法相匹配,但我有点困惑。 GET/Read 和 DELETE/Delete 很明显。
但是,PUT/POST 之间有什么区别?它们是否与创建和更新一一匹配?
【问题讨论】:
标签: http rest crud http-method
在 RESTful 风格的编程中,我们应该使用 HTTP 方法作为我们的构建块。虽然哪些方法与经典的 CRUD 方法相匹配,但我有点困惑。 GET/Read 和 DELETE/Delete 很明显。
但是,PUT/POST 之间有什么区别?它们是否与创建和更新一一匹配?
【问题讨论】:
标签: http rest crud http-method
目前(2016 年)最新的 HTTP 动词是 GET、POST、PATCH、PUT 和 DELETE
概览
希望这会有所帮助!
如果您对设计 REST API 感兴趣,这是一本值得阅读的经典读物! website online versiongithub repository
【讨论】:
Create = PUT with a new URI
POST to a base URI returning a newly created URI
Read = GET
Update = PUT with an existing URI
Delete = DELETE
PUT 可以映射到 Create 和 Update,这取决于与 PUT 一起使用的 URI 的存在。
POST 映射到 Create。
更正:POST 也可以映射到 Update,尽管它通常用于 Create。 POST 也可以是部分更新,因此我们不需要建议的 PATCH 方法。
【讨论】:
我正在寻找相同的答案,这就是 IBM 所说的。 IBM Link
POST Creates a new resource. GET Retrieves a resource. PUT Updates an existing resource. DELETE Deletes a resource.
【讨论】:
stormpath 有一个很棒的 youtube 视频谈话,实际上解释了这一点,URL 应该跳到视频的正确部分:
另外值得一看的是,它有一个多小时的谈话,但如果您考虑花时间构建 REST api,这将非常有趣。
【讨论】:
整个关键在于您是否在进行 幂等 更改。也就是说,如果对消息采取两次行动将导致“相同”的事情出现,就好像它只做了一次一样,那么你就有了一个幂等的变化,它应该被映射到 PUT。如果不是,它映射到 POST。如果您从不允许客户端合成 URL,则 PUT 非常接近于 Update,而 POST 可以很好地处理 Create,但这肯定不是唯一的方法;如果客户端知道它想要创建/foo/abc 并且知道要放什么内容,它就可以作为 PUT 工作。
POST 的规范描述是当您承诺购买某物时:这是一个没有人愿意在不知情的情况下重复的动作。相比之下,预先设置订单的派送地址可以用 PUT 来完成:不管你被告知发送到6 Anywhere Dr, Nowhereville 一次、两次还是一百次:它仍然是同一个地址。这是否意味着它是一个更新?可能是……这完全取决于您要如何编写后端。 (请注意,结果可能不相同:您可以向用户报告他们上次执行 PUT 时作为资源表示的一部分,这将确保重复的 PUT 不会导致相同的结果,但结果仍然会在功能意义上是“相同的”。)
【讨论】:
POST 和PUT 的用例之间的这种区别是一个有趣的区别,应该回答“哪个是'创建',哪个是'更新'?”清楚得多。此外,关于 API 的实现,重复的 PUT 应该相当于静默无操作,而重复的 POST 可能会抛出异常,如果发送的数据的某些方面应该在支持应用程序的数据存储中保持唯一性。
REST 的构建块主要是资源(和 URI)和超媒体。在这种情况下,GET 是获取资源表示的方式(在 CRUD 术语中确实可以映射到 SELECT)。
但是,您不必期望 CRUD 操作和 HTTP 动词之间存在一对一的映射。
PUT 和 POST 之间的主要区别在于它们的幂等性。 POST 也更常用于部分更新,因为 PUT 通常意味着发送资源的全新表示。
我建议阅读以下内容:
HTTP specification 也是一个有用的参考:
PUT 方法要求 封闭实体存储在 提供的请求 URI。
[...]
两者的根本区别 POST 和 PUT 请求反映在 的不同含义 请求-URI。 POST 请求中的 URI 标识将要使用的资源 处理封闭的实体。那 资源可能是接受数据的 进程,通往其他人的门户 协议或单独的实体 接受注释。相比之下, PUT 请求中的 URI 标识 请求中包含的实体—— 用户代理知道 URI 是什么 预期和服务器不得 尝试将请求应用于某些 其他资源。如果服务器愿意 该请求适用于 不同的URI,
【讨论】:
这取决于具体情况..但总的来说:
PUT = 使用资源的具体 URI 更新或更改具体资源。
POST = 在给定 URI 的源下创建一个新资源。
即
编辑博文:
放置: /blog/entry/1
创建一个新的:
发布: /博客/条目
在某些情况下,新资源的 URI 在请求之前是明确的,PUT 可能会创建新资源。 POST 也可以用于实现其他几个用例(GET、PUT、DELETE、HEAD、OPTIONS)没有涵盖的其他用例
对于 CRUD 系统的一般理解是 GET = 请求,POST = 创建,Put = 更新,DELETE = 删除
【讨论】:
Symfony 项目试图将其 HTTP 方法与 CRUD 方法结合起来,their list 将它们关联如下:
值得注意的是,正如他们在该页面上所说,“实际上,许多现代浏览器不支持 PUT 和 DELETE 方法。”
据我所知,Symfony 在生成表单时为那些不支持它们的浏览器“伪造” PUT 和 DELETE,以便尝试尽可能接近使用理论上正确的 HTTP 方法,即使浏览器不支持不支持。
【讨论】:
一般来说,这是我使用的模式:
【讨论】: