前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

PUT 与 PATCH & PUT 与 POST(put与post区别)

qiguaw 2024-10-24 12:59:59 资源文章 47 ℃ 0 评论

介绍

我被要求解释 与PUT之间的区别PATCH。您可能会想,“哦,是的,这是一个常见的面试问题!” 但你知道吗,尽管你认为这很常见,但我实际上不知道如何回答这个问题(是的,也被拒绝了哈哈)。现在我吸取了教训,我决定写一篇文章,不仅是为了帮助自己理解,也是为了那些正在为你(下一次)面试做准备的人!

在本文中,我假设您已经了解 REST 中 HTTP 方法的基础知识,但在深入探讨差异之前,让我们先做一个简短的回顾。


POST,PUT&PATCH

什么是POST?

  • Create在CRUD
  • 一种在资源集合中创建新(从属)资源的方法
  • 创建新资源时,服务器会自动为该新资源分配一个ID。
  • 如果成功创建,将返回 HTTP 状态代码201 (CREATED)并返回带有链接的位置标头,例如https://www.example.com/recipes/1.
  • 这种方法既不安全也不幂等。换句话说,调用两个相同的POST请求将导致两个不同的资源包含相同的信息

Axios 语法(来自 Educative.io 的示例)

const axios = require('axios')

axios.post('https:sample-endpoint.com/user', {
    Name: 'Fred',
    Age: '23'
  })
  .then(function (response) {
    console.log(response);
  })

什么是PUT?

  • Update在CRUD
  • 一种主要更新现有资源的方法。如果资源不存在,API 可能会决定创建资源。
  • 如果成功更新,将返回 HTTP 状态代码200 (OK),或者204 (No Content)如果没有任何更新。如果创建成功,将返回HTTP状态码201 (CREATED)。
  • 此方法不安全,因为它修改(或创建)资源内的状态。
  • 然而,它是idempotent,因为如果再次使用同一调用创建或更新资源,则资源将与同一调用中的资源相同并具有相同的状态。

Axios 语法

const article = { title: 'React PUT Request Example' };
axios.put('https://reqres.in/api/articles/1', article)
  .then(response => this.setState({ updatedAt: response.data.updatedAt }));

什么是PATCH?

  • (也)Update在CRUD
  • 对资源进行部分更新的方法。
  • 如果成功更新,将返回 HTTP 状态代码200 (OK),或者204 (No Content)如果没有任何更新。
  • 这种方法既不安全也不幂等

Axios 语法(来自Mastering JS的示例)

const res = await axios.patch('https://httpbin.org/patch', 'hello=world');

res.data.headers['Content-Type']; // application/x-www-form-urlencoded
res.data.json; // { hello: 'world' }

好吧,现在我们来谈谈差异。


PUT与POST

1. 创建和/或更新?

最明显的区别是,PUT既可以创建又可以修改资源,而POST只能创建资源。

对于PUT,如果Request-URI引用已经存在的资源,则将发生更新操作,否则,如果Request-URI是有效的资源URI,则将创建新资源。

请求-URI 代表:

请求 URI 是请求所适用的资源的统一资源标识符。虽然 URI 理论上可以指统一资源定位符 (URL) 或统一资源名称 (URN),但目前 URI 几乎总是遵循 Web URL 标准语法规则的 HTTP URL。


它的请求语法将如下所示:PUT /users/{user-id}

而对于POST,源服务器接受请求作为由 Request-URI 标识的资源的新下属。

它的请求语法将如下所示:POST /users

2.idempotent

该PUT方法是幂等的。这意味着如果您(重新)尝试多次发送请求,则相当于一次请求修改。

然而,该POST方法不是幂等的。如果您多次重试发送请求,您最终将在服务器上拥有多个具有多个不同 URI 的资源。

3. 实践中

一般来说,PUT方法是用来UPDATE操作的,POST方法是用来CREATE操作的。


PUT与PATCH

1. 部分更新还是全部更新(又名替换)?

PUT并且PATCH都可以用于更新资源。然而,这两者之间最大的区别在于,一种可以更新和替换资源,而另一种可以部分更新。

换句话说,在发出PUT请求时,所包含的实体(您发出请求的特定位置)被视为资源的修改版本,并且客户端请求用新信息替换;当发出PATCH请求时,它仅修改资源的某些部分。

我发现了这个很棒的资源,它以建造房屋为例,这是链接,这是作者的演示方式:

假设我们有这个房子:

// House on plot 1
{
  address: 'plot 1',
  owner: 'segun',
  type: 'duplex',
  color: 'green',
  rooms: '5',
  kitchens: '1',
  windows: 20
}

PUT

// PUT request payload to update windows of House on plot 1
{
  address: 'plot 1',
  owner: 'segun',
  type: 'duplex',
  color: 'green',
  rooms: '5',
  kitchens: '1',
  windows: 21
}

PATCH

// Patch request payload to update windows on the House
{
  windows: 21
}

2.幂等性

PUT出于上述原因是幂等的,而PATCH不是幂等的。如果重新尝试发出请求,将会导致请求失败(Method Not Allowed)。如果PATCH向不存在的 URI 发出请求,则它只会失败,而不会创建新的资源(例如PUT.


你走之前...

希望您能从这篇文章中得到一些收获!回顾一下本文,这些方法的主要区别在于幂等性以及它们如何根据客户端的请求进行操作!

  • PUTvs POST:可以创建新资源,但只能PUT更新/修改资源,并且它是幂等的,但不适用于POST
  • PUTvs PATCH:修改/更新资源。PATCH允许我们部分修改封闭的实体,同时PUT基本上替换整个实体。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表