PUT、POST 和 PATCH 有啥区别?

Posted

技术标签:

【中文标题】PUT、POST 和 PATCH 有啥区别?【英文标题】:What is the difference between PUT, POST and PATCH?PUT、POST 和 PATCH 有什么区别? 【发布时间】:2015-09-14 08:30:35 【问题描述】:

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

【问题讨论】:

***.com/a/2590281/400277 PUT vs POST in REST的可能重复 在现代 Web API 中使用 GET/POST 以外的任何东西都是疯狂的。太多人这样做了。大多数现代应用程序中标识的 URI 不是要替换、更新等的资源。它们不是文档。他们正在调用程序。除了被调用的方法之外,URI 本身很少标识实际资源。因此,当您需要在请求正文中发布 JSON 数据或文件时,请使用 GET 进行查询字符串请求和 POST。 IMO,其他任何东西都试图将涉及 URI 和静态 html 文档操作的过时概念硬塞进一个看起来完全不同的新架构中。 所有很棒的答案。我只是想分享我对the differences and when you should use each one.的回答 @Triynko,不知怎的,你陷入了 Richardson 成熟度模型的第 0 级,该继续前进了:martinfowler.com/articles/richardsonMaturityModel.html 【参考方案1】:

PUT、POST、GET、DELETE 和 PATCH 在 HTTP 动词中的区别:

最常用的 HTTP 动词 POST、GET、PUT、DELETE 类似于数据库中的 CRUD(创建、读取、更新和删除)操作。我们在 capital 的情况下指定这些 HTTP 动词。所以,下面是它们之间的比较。

    创建 - POST 读取 - 获取 更新 - PUT 删除 - 删除

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

注意:由于 POST、PUT、DELETE 修改了内容,使用 Fiddler 对以下 url 的测试只是模仿了更新。它实际上并没有删除或修改。我们可以通过查看状态码来检查是否发生了插入、更新、删除。

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

1) 获取:

GET 是最简单的一种 HTTP 请求方法;每次单击链接或在地址栏中键入 URL 时浏览器使用的一种。它指示服务器将 URL 标识的数据传输给客户端。绝不应该因为 GET 请求而在服务器端修改数据。从这个意义上说,GET 请求是只读的。

检查 Fiddler 或 PostMan: 我们可以使用 Fiddler 来检查响应。打开 Fiddler 并选择 Compose 选项卡。 如下所示指定动词和url,然后单击执行以检查响应。

动词: GET

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

响应:您将得到如下响应:

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

在“快乐”(或非错误)路径中,GET 返回 XML 或 JSON 格式的表示和 200(OK)的 HTTP 响应代码。在错误情况下,它最常返回 404(未找到)或 400(错误请求)。

2) 发布:

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

成功创建后,返回 HTTP 状态 201,返回 Location 标头,其中包含指向新创建资源的链接,HTTP 状态为 201。

检查 Fiddler 或 PostMan: 我们可以使用 Fiddler 来检查响应。打开 Fiddler 并选择 Compose 选项卡。 如下所示指定动词和url,然后单击执行以检查响应。

动词: POST

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

请求正文:

数据: 标题:“富”, 身体:'酒吧', 用户 ID:1000, 编号:1000

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

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

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

3) 放置:

PUT 最常用于更新功能,PUT 到一个已知的资源 URI,请求正文包含原始资源的新更新表示。

检查 Fiddler 或 PostMan: 我们可以使用 Fiddler 来检查响应。打开 Fiddler 并选择 Compose 选项卡。 如下所示指定动词和url,然后单击执行以检查响应。

动词: PUT

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

请求正文:

数据: 标题:“富”, 身体:'酒吧', 用户ID:1, 编号:1

响应:成功更新后,它会从 PUT 中返回 200(如果没有返回正文中的任何内容,则返回 204)。

4) 删除:

DELETE 很容易理解。它用于删除由 URI 标识的资源。

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

检查 Fiddler 或 PostMan: 我们可以使用 Fiddler 来检查响应。打开 Fiddler 并选择 Compose 选项卡。 如下所示指定动词和url,然后单击执行以检查响应。

动词:删除

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

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

PUT 和 PATCH 之间的示例

PUT

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

"first": "Nazmul", "last": "hasan" 所以,这里为了更新名字,我们需要再次发送数据的所有参数。

补丁:

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

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

https://jsonplaceholder.typicode.com/

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

What is the main difference between PATCH and PUT request?

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

【讨论】:

PUT 未更新。 PUT 是在给定的 URI 上创建或替换实体。根据 HTTP 规范,PUT 是幂等的。是的,它可以用来更新,但只考虑更新是不正确的。 我同意 PUT 不是更新的,它可以用替换映射,因为当你发送 PUT 时,它会覆盖现有资源。但是如果我们发送 PATCH,它只会替换指定的条目。 因为 PUT 也可以用于创建,所以我不确定您的回答如何表明我应该使用哪个? 这个答案要好得多,但不能与 PATCH 相比:***.com/a/630475/2391795 这不是您正确发送 POST 的方式,请检查:***.com/questions/7075125/…【参考方案2】:

PUT = 用提供的新表示替换整个资源

PATCH = 用提供的值替换部分源资源和|或更新您尚未提供的资源的其他部分(时间戳)和|或更新资源影响其他资源(关系)

https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-between-put-and-patch?page=1

【讨论】:

PUT 似乎意味着“更新和覆盖”。似乎 PATCH 的意思是“更新和合并”。我只是想想出一致和简洁的术语来描述你的回答很好地解释了什么。【参考方案3】:

请求类型

创建 - POST 读取 - 获取 创建或更新 - PUT 删除 - 删除 更新 - 补丁

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 输入邮箱: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 方法 得到是 发布没有 放是 补丁号* 选项 是 头是的 删除是

资源: 幂等性——What is Idempotency?

【讨论】:

“有时”幂等的真正含义是什么?什么决定幂等性? "Sometimes idempotent" === Not idempotent - 它要么是幂等的,要么不是幂等的,没有中间值。【参考方案4】:

以下定义来自现实世界的示例。

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

    发布

    如果客户端发送的数据没有任何标识符,那么我们将存储数据并分配/生成新的标识符。 如果客户端再次发送相同数据而没有任何标识符,那么我们将存储数据并分配/生成新的标识符。 注意:此处允许重复。

    PUT

    如果客户端发送带有标识符的数据,那么我们将检查该标识符是否存在。如果标识符存在,我们将使用数据更新资源,否则我们将使用数据创建资源并分配/生成新标识符。

    补丁

    如果客户端发送带有标识符的数据,那么我们将检查该标识符是否存在。如果标识符存在,我们将使用数据更新资源,否则我们将抛出异常。

注意:在 PUT 方法中,如果找不到标识符,我们不会抛出异常。但是在 PATCH 方法中,如果找不到标识符,我们将抛出异常。

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

【讨论】:

简单明了的解释! @Yokesh Waran 嘿,我对你的回答做了一些修改。看看他们是否还好。 太简单了!!!【参考方案5】:

PUTPATCH 请求的主要区别:

假设我们有一个资源,其中包含一个人的名字和姓氏。

如果我们想更改名字,那么我们发送一个更新请求

"first": "Michael", "last": "Angelo"

在这里,虽然我们只更改名字,但对于 PUT 请求,我们必须先发送两个参数。 换句话说,必须再次发送所有值,即完整的有效负载。

然而,当我们发送 PATCH 请求时,我们只发送我们想要更新的数据。也就是说,我们只发送名字进行更新,不需要发送姓氏。

【讨论】:

【参考方案6】:

这里是所有的简单描述:

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

【讨论】:

这并不完全准确。 'POST 方法请求目标资源根据资源自己的特定语义处理请求中包含的表示'是 rfc 声明的内容。 “将数据附加到资源的现有表示”是 rfc 提供的示例之一。 tools.ietf.org/html/rfc7231#section-4.3.3 @Chomeh 在哪一层定义了这些语义/rfc?它是框架或语言级别的配置,还是特定于框架特定部分的配置?像,节点的 POST/PUT/PATCH 会与 ruby​​ on rails 不同吗? @stevec 应用程序/API。例如,您可以设计一个 API 接受到 /delete 的 POST,但不一定具有创建新资源的结果(例如 /deletions/id)。【参考方案7】:

PUT 和 PATCH 之间的区别非常合乎逻辑,它们分别发送完整和部分数据以进行替换/更新。但是,只有以下几点

    有时 POST 被视为更新 w.r.t PUT 以进行创建 HTTP 是否要求/检查在 PATCH 中发送完整数据还是部分数据?否则,PATCH 可能与 PUT/POST 中的更新完全相同

【讨论】:

【参考方案8】:

这样想……

POST - 创建

PUT - 替换

补丁 - 更新

GET - 读取

DELETE - 删除

【讨论】:

我可能会添加this distinction:“如果客户端确定结果资源的地址,则 PUT,如果服务器确定则 POST。【参考方案9】:

最简单的解释:

POST - 创建新记录

PUT - 如果记录存在,则更新,否则创建新记录

补丁 - 更新

GET - 读取

DELETE - 删除

【讨论】:

这与您大约两周前发布的Kwame's answer 有何本质不同?

以上是关于PUT、POST 和 PATCH 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

RESTFul 中PUT POST PATCH的区别

HTTP方法GET,POST,PUT和DELETE有啥区别

HTTP POST, PUT PATCH

POST 和 PUT HTTP 请求有啥区别?

Put和Post in Rest之间的区别[重复]

解析HTTP协议六种请求方法,get,head,put,delete,post有啥区别