ChatGPT解决这个技术问题 Extra ChatGPT

PUT、POST 和 PATCH 有什么区别?

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

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

n
node_modules

HTTP 动词中 PUTPOSTGETDELETEPATCH 之间的区别:

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

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

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

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

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

得到:

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

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

动词:得到

网址: 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 标头,其中包含指向具有 201 HTTP 状态的新创建资源的链接。

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

动词:发布

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

请求正文:

data: {
   title: 'foo',
   body: 'bar',
   userId: 1000,
   Id : 1000
}

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

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

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

3)放:

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

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

动词:放

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

请求正文:

data: {
   title: 'foo',
   body: 'bar',
   userId: 1,
   Id : 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 更新请求:

{ "first": "Nazmul", "last": "hasan" }

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

修补:

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

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

https://jsonplaceholder.typicode.com/

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

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

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


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

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

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

POST 如果客户端发送的数据没有任何标识符,那么我们将存储数据并分配/生成一个新的标识符。如果客户端再次发送相同的数据而没有任何标识符,那么我们将存储数据并分配/生成一个新的标识符。注意:此处允许重复。 PUT 如果客户端发送带有标识符的数据,那么我们将检查该标识符是否存在。如果标识符存在,我们将使用数据更新资源,否则我们将使用数据创建资源并分配/生成新标识符。 PATCH 如果客户端发送带有标识符的数据,那么我们将检查该标识符是否存在。如果标识符存在,我们将使用数据更新资源,否则我们将抛出异常。

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

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


简单明了的解释!
@Yokesh Waran 嘿,我对你的回答做了一些修改。看看他们还好吗。
好简单!!!
O
Ozkan

以下是对所有内容的简单描述:

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})。
A
Ankit Rai

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

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

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


看起来 PUT 的意思是“更新和覆盖”。似乎 PATCH 的意思是“更新和合并”。我只是想想出一致和简洁的术语来描述你的答案很好地解释了什么。
A
Ashish

最简单的解释:

POST - 创建新记录

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

补丁 - 更新

获取 - 阅读

删除 - 删除


这与您大约两周前发布的Kwame's answer有何显着不同?
K
Kwame Opare Asiedu

这样想吧……

POST - 创建

PUT - 替换

补丁 - 更新

获取 - 阅读

删除 - 删除


我可能会添加 this distinction: "PUT 如果客户端确定结果资源的地址,如果服务器确定则 POST。"
P
Parth Patel

请求类型

创建 - 发布

阅读 - 获取

创建或更新 - PUT

删除 - 删除

更新 - 补丁

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

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

得到 :-

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

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

邮政 :-

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

放 :-

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

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

执行 put-localhost/1 put email:ppp@ppp.com

{
id:1
email:ppp@ppp.com
}

修补

所以现在出现了补丁请求 PATCH 有时可以是幂等的

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

补丁名称:w

{
id:1
name:w
email:x@x.com
}
HTTP  Method
GET     yes
POST    no
PUT     yes
PATCH   no*
OPTIONS yes
HEAD    yes
DELETE  yes

资源:幂等 -- What is Idempotency?


“有时”幂等的真正含义是什么?什么决定幂等性?
“有时是幂等的” === 不是幂等的 - 它要么是幂等的,要么不是幂等的,没有中间值。
我可以在评论中读到 PUT 更改了资源,但必须发送整套属性那么为什么你可以执行“put email:ppp@ppp.com”?不应该放在 { id:1 name:parth email:ppp@ppp.com} 吗?
S
Stephan Hogenboom

PUT 和 PATCH 请求之间的主要区别:

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

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

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

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

然而,当我们发送 PATCH 请求时,我们只发送我们想要更新的数据。换句话说,我们只发送名字来更新,不需要发送姓氏。


m
manish agrawal

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

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