219

在 RESTful 风格的编程中,我们应该使用 HTTP 方法作为我们的构建块。虽然哪些方法与经典的 CRUD 方法相匹配,但我有点困惑。GET/Read 和 DELETE/Delete 很明显。

但是,PUT/POST 之间有什么区别?它们是否与创建和更新一一匹配?

4

9 回答 9

307
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 一起使用的 URI 的存在,PUT 可以映射到 Create 和 Update。

POST 映射到 Create。

更正:POST 也可以映射到 Update,尽管它通常用于 Create。POST 也可以是部分更新,因此我们不需要建议的 PATCH 方法。

于 2011-06-02T03:38:42.187 回答
51

整个关键是您是否进行幂等更改。也就是说,如果对消息采取两次行动将导致“相同”的事情出现,就好像它只做了一次一样,那么你就有了一个幂等的变化,它应该被映射到 PUT。如果不是,它映射到 POST。如果您从不允许客户端合成 URL,则 PUT 非常接近 Update,而 POST 可以很好地处理 Create,但这肯定不是唯一的方法;如果客户端知道它想要创建/foo/abc并且知道要放什么内容,它就可以作为 PUT 工作。

POST 的规范描述是当您承诺购买某物时:这是一个没有人愿意在不知情的情况下重复的动作。相比之下,预先设置订单的派送地址可以用 PUT 来完成:不管你被告知要发送6 Anywhere Dr, Nowhereville一次、两次还是一百次:它仍然是同一个地址。这是否意味着它是一个更新?可能是……这完全取决于您要如何编写后端。(请注意,结果可能不相同:您可以向用户报告他们上次执行 PUT 的时间作为资源表示的一部分,这将确保重复的 PUT 不会导致相同的结果,但结果仍然会在功能意义上是“相同的”。)

于 2011-06-01T15:23:28.033 回答
38

我正在寻找相同的答案,这就是 IBM 所说的。 IBM 链接

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
于 2013-11-01T13:47:11.377 回答
11

现在(2016 年)最新的 HTTP 动词是 GET、POST、PATCH、PUT 和 DELETE

概述

  • HTTP GET - 选择/请求
  • HTTP PUT - 更新
  • HTTP POST - 插入/创建
  • HTTP PATCH - 当PUT完整的资源表示很麻烦并且使用更多带宽时,例如:当您必须部分更新列时
  • HTTP 删除 - 删除

希望这可以帮助!

如果您对设计 REST API 感兴趣,这是一本值得阅读的经典读物!网站在线版github仓库

于 2016-09-04T02:03:47.160 回答
10

有一个很棒的 youtube video talk bystormpath 实际上解释了这一点,URL 应该跳到视频的正确部分:

风暴路径 youtube 视频

同样值得一看的是,如果您考虑花时间构建 REST api,那么它会花一个多小时的时间交谈,但非常有趣。

于 2013-02-28T16:38:33.863 回答
7

这取决于具体情况..但总的来说:

PUT = 使用资源的具体 URI 更新或更改具体资源。

POST =在给定 URI 的源创建一个新资源。

IE

编辑博客文章:

放置:/blog/entry/1

创建一个新的:

发布:/博客/条目

在某些情况下,新资源的 URI 在请求之前是明确的,PUT 可能会创建新资源。POST 也可用于实现其他几个用例(GET、PUT、DELETE、HEAD、OPTIONS)未涵盖的其他用例

对 CRUD 系统的一般理解是 GET = 请求,POST = 创建,Put = 更新,DELETE = 删除

于 2011-06-01T15:06:03.190 回答
4

REST 的构建块主要是资源(和 URI)和超媒体。在这种情况下,GET是获取资源表示的方法(实际上可以映射到SELECTCRUD 术语中的 a )。

但是,您不必期望 CRUD 操作和 HTTP 动词之间存在一对一的映射。PUT和之间的主要区别在于POST它们的幂等性。POST也更常用于部分更新,这PUT通常意味着发送资源的全新表示。

我建议阅读以下内容:

HTTP 规范也是一个有用的参考:

PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。

[...]

POST 和 PUT 请求的根本区别体现在 Request-URI 的不同含义上。POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。相反,PUT 请求中的 URI 标识了请求中包含的实体——用户代理知道 URI 的意图,服务器不得尝试将请求应用于其他资源。如果服务器希望将请求应用于不同的 URI,

于 2011-06-01T15:08:56.610 回答
3

一般来说,这是我使用的模式:

  • HTTP GET - 选择/请求
  • HTTP PUT - 更新
  • HTTP POST - 插入/创建
  • HTTP 删除 - 删除
于 2011-06-01T15:00:52.433 回答
1

Symfony项目试图将其 HTTP 方法与 CRUD 方法结合起来,它们的列表将它们关联如下:

  • GET 从服务器获取资源
  • POST 在服务器上创建资源
  • PUT 更新服务器上的资源
  • DELETE 从服务器中删除资源

值得注意的是,正如他们在该页面上所说,“实际上,许多现代浏览器不支持 PUT 和 DELETE 方法。”

据我记得,Symfony 在生成表单时为那些不支持它们的浏览器“伪造” PUT 和 DELETE,以便尝试尽可能接近使用理论上正确的 HTTP 方法,即使浏览器不支持它。

于 2011-06-01T15:04:27.347 回答