哪些HTTP方法与哪些CRUD方法匹配?


213

在RESTful样式编程中,我们应该使用HTTP方法作为构建基块。尽管有些方法与经典的CRUD方法匹配,但我有些困惑。GET / Read和DELETE / Delete很明显。

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

Answers:


298
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映射到创建。

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


16
+1:区分PUT以创建由客户端分配名称(URI)的资源和POST以创建由服务器分配名称的资源之间的区别很重要。有关此主题的讨论,请参阅Richardson和Ruby的Restful Web Services(O'Reilly)。
Jim Ferrans 2011年

9
并且由于Web浏览器尚不支持PUT和DELETE,因此可以通过在要发布的URI上添加诸如method = PUT或method = DELETE之类的查询字符串参数来“重载POST”,认为可以。
Jim Ferrans 2011年


13
通过XHR,Web浏览器也支持@JimFerrans PUT和DELETE。但是,在HTML表单的上下文中,HTML规范不支持它们,因此浏览器也不能。
2013年

3
虽然无法规范地映射到CRUD中的字母,但是许多REST框架也使用GET / entity /来列出类型为entity的实体。GET / entity / id将读取与id匹配的特定实体。
Toddius Zho,

49

关键在于您是否要进行幂等的更改。就是说,如果对消息执行两次操作将导致“相同”的事情就好像只执行了一次一样,那么您将得到幂等的更改,应将其映射到PUT。如果不是,它将映射到POST。如果您从不允许客户端合成URL,则PUT非常接近Update,而POST可以很好地处理Create,但这绝对不是唯一的方法。如果客户端知道它要创建/foo/abc并且知道要放置什么内容,则它作为PUT可以正常工作。

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


1
POST和的用例之间的区别PUT是一个有趣的区别,应该回答“哪个是'创建'和哪个是'更新'?”的答案。清楚得多。此外,关于API的实现,可以认为重复项PUT应等于无声操作,而POST如果要发送的数据的某些方面在数据存储中保持唯一性,则重复项可能会引发异常。支持应用程序。
zerobandwidth

2
该答案及其后的评论提出了一个重要的观点,在将CRUD等同于HTTP REST语义(1to1)时应谨慎行事。这不是规范的映射。
Martin Spamer

35

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

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

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

总览

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

希望这可以帮助!

如果您对设计REST API感兴趣,那么这是一本Ansewome读物!网站在线版本 github 存储库


1
从18年2月开始,请注意,客户端和服务器库中尚未完全实现PATCH。
迪兹利

哦,好的,谢谢,我明白了。您介意发布链接/参考,以便我可以看看吗?
d1jhoni1b

9

Stormpath上有一段很棒的youtube视频谈话,实际上对此做了解释,URL应该跳到视频的正确部分:

Stormpath YouTube视频

同样值得一提的是,它花费了一个多小时的时间,但是如果您想花时间来构建REST API,则非常有趣。


7

这取决于具体情况..但通常:

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

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

编辑博客文章:

输入:/ blog / entry / 1

创建一个新的:

POST:/ blog / entry

在某些情况下,PUT可能会创建新资源,其中新资源的URI在请求之前是明确的。POST也可以用于实现其他几个用例,而其他用例则不涉及(GET,PUT,DELETE,HEAD,OPTIONS)

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


4

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

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

我建议阅读以下内容:

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

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

[...]

POST和PUT请求之间的根本区别体现在Request-URI的不同含义上。POST请求中的URI标识将处理封闭实体的资源。该资源可能是一个数据接受过程,某个其他协议的网关或一个接受注释的单独实体。相比之下,PUT请求中的URI标识请求中包含的实体-用户代理知道要使用的URI,并且服务器绝不能尝试将请求应用于其他资源。如果服务器希望将请求应用于其他URI,


3

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

  • HTTP GET-选择/请求
  • HTTP PUT-更新
  • HTTP POST-插入/创建
  • HTTP删除-删除

5
PUT和POST与Update或Create都不完全匹配;PUT是“设置”的(即,您事先知道资源名称并提供要使用的值),而POST是其他所有内容。关键是要考虑您正在做的事情是否是幂等的
Donal Fellows

1
+1评论。两者之间绝对映射的假设可能会引起误解。例如,对某些URI的HTTP DELETE操作可能只是修改(即UPDATE)服务器端记录,以便对HTTP GET操作不再返回表示形式。
站立

4
PUT和POST与Update或Create都不完全匹配。是的,但AJ描述了使用的模式。
Piotr Dobrogost 2011年

1

Symfony的项目试图保持它的HTTP方法加入了CRUD方法,以及他们的名单他们同伙如下:

  • GET从服务器检索资源
  • POST在服务器上创建资源
  • PUT更新服务器上的资源
  • 删除从服务器删除资源

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

据我所知,Symfony为那些在生成表单时不支持它们的浏览器“伪造”了PUT和DELETE,以便即使在浏览器不支持的情况下也尽可能地使用理论上正确的HTTP方法它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.