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】:PUT 和 PATCH 请求的主要区别:
假设我们有一个资源,其中包含一个人的名字和姓氏。
如果我们想更改名字,那么我们发送一个更新请求
"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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章