PUT,POST和PATCH有什么区别?


283

HTTP协议中的PUT,POST和PATCH方法之间有什么区别?




12
在现代Web API中,使用GET / POST之外的任何其他方法都是疯狂的。太多了。大多数现代应用程序中标识的URI并非要替换,更新等的资源。它们不是文档。他们被称为程序。除了被调用的方法外,URI本身很少标识实际资源。因此,当您需要在请求正文中发布JSON数据或文件时,请对查询字符串请求和POST使用GET。IMO,其他任何事情都试图将涉及URI和对静态HTML文档的操作的过时概念塞进一个看起来根本不像它的新体系结构。
Triynko

1
所有好的答案。我只是想分享我对差异的
火车

您能否在问题中添加“ Laravel”标签,或者更具体地指定“您是否可以编辑问题内容并添加DELETE”,那么这对我们所有人都将更为有益。
Vipertecpro

Answers:


200

HTTP动词中的PUT,POST,GET,DELETE和PATCH之间的区别:

最常用的HTTP动词POST,GET,PUT,DELETE与数据库中的CRUD(创建,读取,更新和删除)操作相似。我们以大写字母指定这些HTTP动词。因此,以下是它们之间的比较。

  1. 创建-POST
  2. 阅读-GET
  3. 更新-PUT
  4. 删除-删除

补丁:对资源提交部分修改。如果只需要更新资源的一个字段,则可能需要使用PATCH方法。

注意:
由于POST,PUT,DELETE修改了内容,因此使用Fiddler对以下URL进行的测试只会模仿更新。它实际上并没有删除或修改。我们只能看到状态代码来检查是否发生插入,更新,删除。

网址: http //jsonplaceholder.typicode.com/posts/

1)获取:

GET是最简单的HTTP请求方法类型。每次您单击链接或在地址栏中输入URL时浏览器都会使用的浏览器。它指示服务器将URL标识的数据传输到客户端。永远不要由于GET请求而在服务器端修改数据。从这个意义上说,GET请求是只读的。

使用Fiddler或PostMan 进行检查我们可以使用Fiddler来检查响应。打开Fiddler,然后选择“撰写”选项卡。指定动词和URL,如下所示,然后单击“执行”以检查响应。

动词: GET

网址: http //jsonplaceholder.typicode.com/posts/

响应:您将获得以下响应:

“ userId”:1,“ id”:1,“ title”:“ sunt aut ...”,“ body”:“ quia et suscipit ...”

在“高兴”(或非错误)路径中,GET返回XML或JSON表示形式以及HTTP响应代码200(确定)。在错误情况下,它通常会返回404(找不到)或400(错误请求)。

2)开机自检:

POST动词通常用于创建新资源。特别是,它用于创建从属资源。也就是说,从属于某些其他(例如父级)资源。

创建成功后,返回HTTP状态201,并返回一个Location头,其中包含指向具有201 HTTP状态的新创建资源的链接。

使用Fiddler或PostMan 进行检查我们可以使用Fiddler来检查响应。打开Fiddler,然后选择“撰写”选项卡。指定动词和URL,如下所示,然后单击“执行”以检查响应。

动词: POST

网址: http //jsonplaceholder.typicode.com/posts/

请求正文:

数据:{title:'foo',body:'bar',userId:1000,ID:1000}

响应:您将收到响应代码201。

如果要检查Id = 1000插入的记录,请将动词更改为Get并使用相同的url,然后单击Execute。

如前所述,上述url仅允许读取(GET),而我们不能真正读取更新的数据。

3)放置:

PUT通常用于更新功能,通过请求主体包含原始资源的新近更新表示,将PUT映射到已知资源URI。

使用Fiddler或PostMan 进行检查我们可以使用Fiddler来检查响应。打开Fiddler,然后选择“撰写”选项卡。指定动词和URL,如下所示,然后单击“执行”以检查响应。

动词: PUT

网址: http //jsonplaceholder.typicode.com/posts/1

请求正文:

数据:{title:'foo',body:'bar',userId:1,Id:1}

响应:成功更新后,它将从PUT返回200(如果未返回任何内容,则返回204)。

4)删除:

删除非常容易理解。它用于删除 URI标识的资源。

成功删除后,返回HTTP状态200(OK)以及响应正文,可能是已删除项目的表示形式(通常需要太多带宽)或已包装的响应(请参见下面的返回值)。要么返回HTTP状态204(没有内容),就没有响应主体。换句话说,建议使用无主体的204状态或JSEND样式的响应以及HTTP状态200。

使用Fiddler或PostMan 进行检查我们可以使用Fiddler来检查响应。打开Fiddler,然后选择“撰写”选项卡。指定动词和URL,如下所示,然后单击“执行”以检查响应。

动词:删除

网址: http //jsonplaceholder.typicode.com/posts/1

响应:成功删除后,它将返回HTTP状态200(确定)以及响应正文。

PUT和PATCH之间的示例

如果必须更改我的名字,请发送PUT更新请求:

{“ first”:“ Nazmul”,“ last”:“ hasan”}因此,为了更新名字,我们需要再次发送数据的所有参数。

补丁:

补丁请求说,我们只会发送需要修改的数据,而不会修改或影响数据的其他部分。例如:如果我们只需要更新名字,就只传递名字。

请参考以下链接以获取更多信息:

https://jsonplaceholder.typicode.com/

https://github.com/typicode/jsonplaceholder#how-to

PATCH和PUT请求之间的主要区别是什么?

http://www.restapitutorial.com/lessons/httpmethods.html


62
PUT未更新。PUT是在给定URI处创建或替换实体。根据HTTP规范,PUT是幂等的。是的,它可以用于更新,但是仅考虑更新是不正确的。
马拉多

2
我同意PUT不会更新,可以使用replace进行映射,因为当您发送PUT时,它将覆盖现有资源。但是,如果我们发送PATCH,它将仅替换指定的条目。
Atul Chavan

1
由于还可以使用PUT进行创建,因此我不确定您的答案如何表明我应该使用哪个?
罗伯P.

1
这个答案要好得多,但不能与PATCH相比:stackoverflow.com/a/630475/2391795
Vadorequest


11

以下定义来自真实示例。

示例概述
对于每个客户数据,我们将存储一个标识符以查找该客户数据,并将该标识符发送回该客户以供参考。

  1. 开机自检

    • 如果客户使用POST方法发送没有任何标识符的数据,则我们将存储它并分配一个新的标识符。
    • 如果客户使用POST方法再次发送相同的数据而没有任何标识符,那么我们将存储它并分配一个新的标识符。
    • 注意:此处允许重复
    • 如果客户发送带有标识符的数据,那么我们将检查该标识符是否存在。如果标识符存在,我们将更新数据,否则我们将创建数据并分配一个新的标识符。
  2. 补丁

    • 如果客户发送带有标识符的数据,那么我们将检查该标识符是否存在。如果标识符存在,我们将更新数据,否则将引发异常。

注意:在Put方法上,如果找不到标识符,则不会引发异常。但是在Patch方法中,如果找不到标识符,则会引发异常。

如果您对以上内容有任何疑问,请告诉我。


8

请求类型

  • 创建-POST
  • 阅读-GET
  • 创建或更新-PUT
  • 删除-删除
  • 更新-PATCH

GET / PUT是幂等的PATCH有时是幂等的

什么是幂等-这意味着如果我们多次触发查询,它就不会影响查询结果。(相同的输出。假设一头母牛怀孕了,如果我们再次繁殖它,那么它就不能多次怀孕)。

get :-

简单得到。从服务器获取数据并将其显示给用户

{
id:1
name:parth
email:x@x.com
}

post :-

在数据库中创建新资源。这意味着它将添加新数据。它不是幂等的。

put :-

创建新资源,否则添加到现有资源。幂等的,因为它每次都会更新相同的资源,并且输出将相同。 例如 -初始数据

{
id:1
name:parth
email:x@x.com
}
  • 执行put-localhost / 1 put电子邮件:ppp@ppp.com
{
id:1
email:ppp@ppp.com
}

patch

所以现在打补丁请求PATCH有时是幂等的

id:1
name:parth
email:x@x.com
}

补丁名称:w

{
id:1
name:w
email:x@x.com
}
HTTP方法
得到是
开机自检
放是
补丁号*
选项是
头是
删除是

资源:等幂- 什么是等幂?


“有时”幂等的真正含义是什么?决定幂等性的因素是什么?
聚{

7

这是所有内容的简单说明:

  • POST始终用于创建资源(无论是否重复)
  • PUT用于检查资源是否存在然后更新,否则创建新资源
  • PATCH始终用于更新资源

5

PUTPATCH请求之间的主要区别:

假设我们有一个保存一个人的名字和姓氏的资源。

如果要更改名字,则发送更新请求

{ "first": "Michael", "last": "Angelo" }

在这里,尽管我们仅更改了名字,但是对于PUT请求,我们必须首先发送参数,最后发送参数。
换句话说,必须再次发送所有值,即完整的有效负载。

但是,当我们发送PATCH请求时,我们仅发送我们要更新的数据。换句话说,我们只发送姓氏进行更新,而无需发送姓氏。


2

在逻辑上,PUT和PATCH分别发送全部数据和部分数据以进行替换/更新是完全合理的。但是,如下几点

  1. 有时POST被认为是用于PUT创建的更新
  2. HTTP是否强制/检查在PATCH中发送完整数据还是部分数据?否则,PATCH可能与PUT / POST中的更新完全相同

2

这样想吧...

开机自检-创建

放置-更换

补丁-更新

GET-阅读

删除-删除


2
我可能会添加这种区别:“ 如果客户端确定了结果资源的地址,则输入PUT,如果服务器确定结果的地址,则输入POST。
ruffin

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.