WHAT - 不同 HTTP Methods 使用场景、使用方法和可能遇到的问题

目录

  • 前言
  • 基本介绍
  • 具体介绍
    • 前置知识:幂等和非幂等
      • 幂等操作
      • 非幂等操作
      • 幂等性和非幂等性的应用场景
      • 总结
    • 1. GET
    • 2. POST
    • 3. PUT
    • 4. PATCH
      • 1. 确保操作是幂等的
      • 2. 使用版本控制或条件更新
      • 3. 全量更新部分属性
      • 4. 使用特定操作指令
      • 5. 幂等标识符
      • 示例代码
      • 总结
    • 5. DELETE
    • 6. HEAD
    • 7. OPTIONS
    • 8. CONNECT
    • 9. TRACE
    • 总结

前言

HTTP Methods: Request methods define the type of action you are requesting to be performed.

  1. GET - Requests retrieve resource information
  2. POST - The server creates a new entry in a database
  3. PUT - Updates an existing resource
  4. PATCH - Very similar to PUT but makes a partial update on a resource
  5. DELETE - Deletes resource or related component
  6. HEAD - Retrieve response headers identical to those of a GET request, but without the response body.
  7. CONNECT - Establishes a tunnel to the server identified by the target resource
  8. OPTIONS - Describe the communication options for the target resource
  9. TRACE - Performs a message loop-back test along the path to the target resource
  10. <custom> - Some APIs use custom request methods such as LIST. Type in your custom methods.

基本介绍

MDN - HTTP Request Methods

HTTP 方法是用于指示请求的类型的动作的标准化方式。以下是常见的 HTTP 方法:

  1. GET: 从服务器检索资源。通常用于获取数据。
  2. POST: 向服务器发送数据以创建资源。常用于提交表单或上传文件。
  3. PUT: 向服务器发送数据以更新资源。通常用于更新现有资源的全部内容。
  4. PATCH: 向服务器发送部分数据以更新资源。通常用于部分更新资源。
  5. DELETE: 从服务器删除资源。
  6. HEAD: 检索资源的头部信息,类似于 GET 请求,但不返回资源的主体部分。
  7. OPTIONS: 返回服务器支持的所有 HTTP 方法。
  8. CONNECT: 建立一个到目标资源的隧道。主要用于代理服务器。
  9. TRACE: 执行一个消息环回测试,沿着路径到目标资源的请求的路由。

示例代码

这里是一个简单的使用 fetch 函数执行几种常见 HTTP 方法(get、post、put、patch、delete)的示例代码:

async function httpRequest(method: string, url: string, data?: any) {const options: RequestInit = {method: method,headers: {'Content-Type': 'application/json'},body: data ? JSON.stringify(data) : undefined};try {const response = await fetch(url, options);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const result = await response.json();return result;} catch (error) {console.error('Error:', error);}
}// 示例用法
const apiUrl = 'https://jsonplaceholder.typicode.com/posts';// GET 请求
httpRequest('GET', apiUrl).then(data => console.log(data));// POST 请求
httpRequest('POST', apiUrl, { title: 'foo', body: 'bar', userId: 1 }).then(data => console.log(data));// PUT 请求
httpRequest('PUT', `${apiUrl}/1`, { id: 1, title: 'foo', body: 'bar', userId: 1 }).then(data => console.log(data));// PATCH 请求
httpRequest('PATCH', `${apiUrl}/1`, { title: 'foo' }).then(data => console.log(data));// DELETE 请求
httpRequest('DELETE', `${apiUrl}/1`).then(data => console.log(data));

说明

  1. httpRequest: 一个通用的 HTTP 请求函数,接受 HTTP 方法、URL 和可选的数据。
  2. RequestInit: 用于配置 fetch 请求的选项,包括方法、头部和主体。
  3. fetch: 执行 HTTP 请求的 JavaScript API。

这个示例演示了如何使用 fetch 函数执行各种 HTTP 方法的请求。你可以根据需要调整 urldata 参数以匹配你的具体 API。

具体介绍

前置知识:幂等和非幂等

幂等性(Idempotency)是计算机科学中的一个重要概念,用于描述操作的可重复性和稳定性。在 HTTP 请求中,幂等性表示多次执行相同的请求应当产生相同的结果。

幂等操作

定义: 幂等操作是指无论操作执行多少次,产生的效果都相同。

HTTP 方法的幂等性:

  • GET: 幂等。多次执行 GET 请求会返回相同的资源数据,不会改变服务器状态。
  • PUT: 幂等。多次执行 PUT 请求将资源替换为相同内容,因此效果相同。
  • DELETE: 幂等。多次执行 DELETE 请求会删除资源,且删除不存在的资源不会再有变化。
  • HEAD: 幂等。多次执行 HEAD 请求会返回相同的头部信息,不会改变服务器状态。
  • OPTIONS: 幂等。多次执行 OPTIONS 请求会返回相同的支持方法列表,不会改变服务器状态。
  • TRACE: 幂等。多次执行 TRACE 请求会返回相同的路径信息,不会改变服务器状态。

非幂等操作

定义: 非幂等操作是指操作执行多次会产生不同的效果。

HTTP 方法的非幂等性:

  • POST: 非幂等。多次执行 POST 请求会创建多个资源,产生不同的结果。
  • PATCH: 通常非幂等。多次执行 PATCH 请求可能会导致资源的部分更新,产生不同的结果。尽管有时可以设计成幂等,但一般认为是非幂等的。

幂等性和非幂等性的应用场景

幂等性应用场景:

  • 数据读取: 使用 GET 方法读取数据,无论请求多少次,数据不会改变。
  • 资源替换: 使用 PUT 方法完全替换资源,多次请求结果相同。
  • 资源删除: 使用 DELETE 方法删除资源,多次请求结果一致。

非幂等性应用场景:

  • 数据创建: 使用 POST 方法创建新资源,每次请求都会产生新的资源。
  • 部分更新: 使用 PATCH 方法更新资源的部分内容,每次请求可能产生不同的结果。

总结

理解幂等性和非幂等性对于设计和实现可靠的 HTTP API 非常重要。幂等操作可以提高系统的稳定性和可预测性,而非幂等操作适合用于创建或部分更新资源。在实际开发中,选择合适的 HTTP 方法来满足业务需求,同时考虑幂等性,确保系统的健壮性和一致性。

1. GET

使用场景:

  • 用于从服务器获取资源数据,如网页、图片、JSON 数据等。
  • 适合只读取数据而不改变服务器状态的请求。

使用方法:

fetch('https://example.com/data').then(response => response.json()).then(data => console.log(data));

可能遇到的问题:

  • 缓存问题:浏览器可能缓存 GET 请求的响应,导致获取的不是最新数据。可以通过设置请求头或在 URL 中添加时间戳来避免。
  • URL 长度限制:有些浏览器对 URL 长度有限制,GET 请求参数太多时可能会出问题。

2. POST

使用场景:

  • 用于向服务器发送数据以创建新资源,例如提交表单、上传文件等。
  • 适合需要将数据发送到服务器进行处理的请求。

使用方法:

fetch('https://example.com/api', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ name: 'John', age: 30 })
}).then(response => response.json()).then(data => console.log(data));

可能遇到的问题:

  • 重复提交:用户可能会多次点击提交按钮,导致重复提交。可以通过禁用按钮或其他方式避免。
  • CSRF 攻击:需要防范跨站请求伪造攻击,通常通过使用 CSRF 令牌来防御。

3. PUT

使用场景:

  • 用于更新服务器上的现有资源的全部内容。
  • 适合需要完全替换资源的请求。

使用方法:

fetch('https://example.com/api/resource/1', {method: 'PUT',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ id: 1, name: 'John', age: 31 })
}).then(response => response.json()).then(data => console.log(data));

可能遇到的问题:

  • 幂等性:PUT 请求应当是幂等的,多次执行相同的 PUT 请求应当产生相同的结果。
  • 数据完整性:需要确保发送的数据是完整的,因为 PUT 是替换整个资源。

4. PATCH

使用场景:

  • 用于更新服务器上的资源的部分内容。
  • 适合需要部分更新资源的请求。

使用方法:

fetch('https://example.com/api/resource/1', {method: 'PATCH',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ age: 31 })
}).then(response => response.json()).then(data => console.log(data));

可能遇到的问题:

  • 部分更新:确保只发送需要更新的字段,避免影响其他字段。
  • 幂等性:虽然 PATCH 可以是非幂等的,但尽量使其幂等,即多次相同的 PATCH 请求应当产生相同的结果。

延伸

要确保 PATCH 请求是幂等的,可以采取以下几种策略:

1. 确保操作是幂等的

在服务器端处理 PATCH 请求时,确保每次相同的请求对资源产生相同的修改效果。这通常涉及在更新资源时使用幂等的方法。

示例: 更新用户的某个属性

// PATCH 请求体
{"age": 31
}

服务器接收到这个请求时,只更新 age 属性,不改变其他属性。

2. 使用版本控制或条件更新

通过检查资源的版本或条件来确保更新操作的幂等性。例如,可以使用乐观锁定或 If-Match 头来进行条件更新。

示例:

PATCH /resource/1 HTTP/1.1
Host: example.com
Content-Type: application/json
If-Match: "abc123"{"age": 31
}

服务器只有在资源的版本匹配 If-Match 头中提供的版本时才会进行更新,这样可以确保幂等性。

3. 全量更新部分属性

尽量在 PATCH 请求中提供所有需要更新的字段,即使某些字段的值没有变化。这确保了每次请求都是对特定字段的完整更新,而不是依赖于资源的当前状态。

示例:

// PATCH 请求体
{"name": "John","age": 31,"email": "john@example.com"
}

4. 使用特定操作指令

在 PATCH 请求体中明确指定操作类型,如 replaceaddremove 等。这些操作可以使用 JSON Patch 格式来表示。

JSON Patch 示例:

[{ "op": "replace", "path": "/age", "value": 31 }
]

服务器根据操作指令执行相应的更新,从而确保幂等性。

5. 幂等标识符

使用幂等标识符来确保每个请求只被处理一次。客户端生成一个唯一的幂等标识符,并在请求中发送给服务器。服务器在处理请求时检查这个标识符,确保每个标识符只处理一次。

示例:

PATCH /resource/1 HTTP/1.1
Host: example.com
Content-Type: application/json
Idempotency-Key: 123e4567-e89b-12d3-a456-426614174000{"age": 31
}

示例代码

以下是一个简单的 Node.js 服务器示例,展示如何实现幂等的 PATCH 请求:

const express = require('express');
const app = express();
app.use(express.json());let resource = { id: 1, name: 'John', age: 30, email: 'john@example.com' };
let processedRequests = {};app.patch('/resource/:id', (req, res) => {const idempotencyKey = req.headers['idempotency-key'];if (idempotencyKey && processedRequests[idempotencyKey]) {return res.status(200).send(processedRequests[idempotencyKey]);}const update = req.body;// Update resource in an idempotent wayif (update.name !== undefined) resource.name = update.name;if (update.age !== undefined) resource.age = update.age;if (update.email !== undefined) resource.email = update.email;const response = { message: 'Resource updated', resource };if (idempotencyKey) {processedRequests[idempotencyKey] = response;}res.status(200).send(response);
});app.listen(3000, () => {console.log('Server running on port 3000');
});

总结

确保 PATCH 请求幂等性的方法包括:

  1. 确保操作是幂等的:每次相同的请求应产生相同的结果。
  2. 使用版本控制或条件更新:如 If-Match 头。
  3. 全量更新部分属性:确保所有需要更新的字段都包含在请求中。
  4. 使用特定操作指令:如 JSON Patch 格式。
  5. 使用幂等标识符:确保每个请求只处理一次。

通过这些方法,可以确保 PATCH 请求的幂等性,从而提高系统的可靠性和一致性。

5. DELETE

使用场景:

  • 用于从服务器删除资源。
  • 适合需要删除资源的请求。

使用方法:

fetch('https://example.com/api/resource/1', {method: 'DELETE'
}).then(response => {if (response.ok) {console.log('Resource deleted');}});

可能遇到的问题:

  • 幂等性:DELETE 请求应当是幂等的,多次执行相同的 DELETE 请求应当产生相同的结果。
  • 资源不存在:需要处理删除不存在的资源的情况,通常返回 404 状态码。

6. HEAD

使用场景:

  • 用于检索资源的元数据,而不获取资源的主体部分。
  • 适合需要检查资源是否存在或获取资源的头部信息(如大小、类型)的请求。

使用方法:

fetch('https://example.com/data', {method: 'HEAD'
}).then(response => {if (response.ok) {console.log('Resource exists');}});

可能遇到的问题:

  • 信息有限:HEAD 请求只返回头部信息,不返回实际数据主体,需根据返回的头部信息判断资源状态。

7. OPTIONS

使用场景:

  • 用于查询服务器支持的请求方法。
  • 适合在跨域请求前检查服务器是否允许特定方法的请求。

使用方法:

fetch('https://example.com/api', {method: 'OPTIONS'
}).then(response => {if (response.ok) {console.log('Options:', response.headers.get('Allow'));}});

可能遇到的问题:

  • 复杂请求:在跨域资源共享 (CORS) 中,复杂请求需要先发送 OPTIONS 请求,检查服务器是否允许请求方法。更具体的内容可以阅读 WHAT - http headers 介绍(含 CORS 配置)

8. CONNECT

使用场景:

  • 用于建立到目标资源的隧道,主要用于代理服务器。
  • 适合在需要通过代理进行安全连接(如 HTTPS)的请求。

使用方法:
CONNECT 方法通常由浏览器或其他客户端自动处理,用户不直接使用。

可能遇到的问题:

  • 代理配置:确保代理服务器正确配置,以支持 CONNECT 方法。

9. TRACE

使用场景:

  • 用于执行消息环回测试,诊断路径问题。
  • 适合在开发和调试时检查请求的路径和中间代理的修改。

使用方法:
TRACE 方法通常由开发工具或诊断工具使用,用户不直接使用。

可能遇到的问题:

  • 安全问题:TRACE 方法可能被滥用进行跨站脚本攻击(XSS),许多服务器默认禁用 TRACE 方法。

总结

每个 HTTP 方法都有其特定的使用场景和可能遇到的问题。根据需求选择合适的方法,并注意相应的安全性和幂等性,确保请求的正确性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07 JSP

文章目录 JSP1、JSP 概述2、JSP 脚本和缺点3、EL 表达式4、JSTL标签5、MVC模式和三层架构6、案例 JSP 1、JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面 &#xff08;1&#xff09;是一种动态的网页技术 &#xff08;2&…

【C++高阶】哈希之美:探索位图与布隆过滤器的应用之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现unordered 的奥秘 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀哈希应用 &#x1f4…

C++中的虚函数与多态机制如何工作?

在C中&#xff0c;虚函数和多态机制是实现面向对象编程的重要概念。 虚函数是在基类中声明的函数&#xff0c;可以在派生类中进行重写。当基类的指针或引用指向派生类的对象时&#xff0c;通过调用虚函数可以实现动态绑定&#xff0c;即在运行时确定要调用的函数。 多态是指通…

Cocos Creator 小游戏案例

最近在计划学习小游戏开发&#xff0c;查阅了一些资料&#xff0c;也找到了许多有趣的案例&#xff0c;特此记录与大家分享。 1. 连点成线 http://game.zaiwuchuan.com/yibihua 2. 颜色分类 http://game.zaiwuchuan.com/zhaoxiansuo 3. 星空一笔画 http://game.zaiwuchu…

大模型llama结构技术点分享;transformer模型常见知识点nlp面经

1、大模型llama3技术点 参考&#xff1a;https://www.zhihu.com/question/662354435/answer/3572364267 Llama1-3&#xff0c;数据tokens从1-2T到15T;使用了MHA&#xff08;GQA缓存&#xff09;&#xff1b;上下文长度从2-4-8K&#xff1b;应用了强化学习对其。 1、pretraini…

分布式事务(典型的分布式事务场景+CAP+解决方案)

分布式事务与分布式锁的区别&#xff1a; 分布式锁解决的是分布式资源抢占的问题&#xff1b;分布式事务和本地事务是解决流程化提交问题。 SQL中的4个事务隔离级别&#xff1a;&#xff08;1&#xff09;读未提交&#xff08;2&#xff09;读已提交&#xff08;3&#xff09…

如何远程开发完整分析一台新能源车BMS电池管理系统CAN数据矩阵

随着我国新能源汽车的崛起&#xff0c;从网络管理平台、数据中心、科研机构、高校教学、车型对标、整车DBC控制策略分析、电池管理系统研究、电池健康管理、网约车管理、电池梯度利用、车队管理等多方面的市场需求&#xff0c;完整分析一台新能源车BMS电池管理系统的CAN矩阵开发…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中&#xff0c;经常会遇到一些图片是由多个图片拼接来的&#xff0c;如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢&#xff0c;这是文本要做的事情。 造数据 假设拼接方式有…

生成式AI与自然语言处理的结合-提升生成式AI的语言理解能力

引言 近年来&#xff0c;生成式AI已逐渐成为科技发展的前沿领域&#xff0c;其未来发展方向备受关注。对于人类生活和工作方式的影响&#xff0c;生成式AI在对话系统&#xff08;Chat&#xff09;和自主代理&#xff08;Agent&#xff09;中的表现引发了广泛讨论。本文将全面探…

Postman中的API Schema验证:确保响应精准无误

Postman中的API Schema验证&#xff1a;确保响应精准无误 在API开发和测试过程中&#xff0c;验证响应数据的准确性和一致性是至关重要的。Postman提供了一个强大的功能——API Schema验证&#xff0c;它允许开发者根据预定义的JSON Schema来检查API响应。本文将详细介绍如何在…

微软全球蓝屏带来的思考及未来战争走向

微软全球蓝屏事件不仅揭示了技术层面的问题和挑战&#xff0c;还引发了对未来战争走向的一些深入思考。以下是关于这些思考的内容&#xff1a; 微软全球蓝屏带来的思考&#xff1a; 系统稳定性与安全性&#xff1a;微软全球蓝屏事件凸显了操作系统稳定性和安全性的重要性。一…

Oracle配置TCPS加密协议测试

文章目录 一、环境信息二、配置过程1.创建证书2.监听配置2.1.配置sqlnet.ora2.2.配置listener.ora文件2.3.配置tnsnames.ora文件2.4.重载监听 3.数据库本地测试3.1. tcps登录测试3.2.日志监控 一、环境信息 操作系统&#xff1a;Linux 版本信息&#xff1a;Oracle 19c 参考文档…

asp.net core 集成redis详解

ASP.NET Core 集成 Redis 详解如下&#xff1a; 目录 一、Redis简介 二、在ASP.NET Core中集成Redis 三、Redis的高级用法 四、注意事项 一、Redis简介 Redis是一个开源的内存数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理。Redis内置了复制、Lua脚本、…

在可编辑 div (contentEditable)末尾插入换行符(\n 或 \<br\>)无效的解决办法

背景: 给可编辑 div 末尾插入换行符, 发现仍然未换行; 解决方法: 提前给 div 末尾插入一个 <br> 就行了, 之后看自己情况要不要去掉 示例代码: // 如果输入框末尾没有 BR 换行符, 则自动加一个, 避免 Ctrl Enter 两次才显示 const currLastEl dom_input.lastElement…

缓存框架 Caffeine 的可视化探索与实践

作者&#xff1a;vivo 互联网服务器团队- Wang Zhi Caffeine 作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。 一、背景 Caffeine缓存是一个高性能、可扩展、内存优化的 Java 缓存库&#xff0c;基于 Google 的 Guava Cac…

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文可以让读者用作自查&#xff0c;答案在后面&#xff0…

跟《经济学人》学英文:2024年07月20日这期 At last, Wall Street has something to cheer

At last, Wall Street has something to cheer 华尔街终于有值得欢呼的事情了 at last&#xff1a;终于&#xff1b;最后&#xff1b; Consumer banks, on the other hand, are starting to suffer 原文&#xff1a; Capital markets are twitchy. When interest rates spi…

数据危机!4大硬盘数据恢复工具,教你如何正确挽回珍贵记忆!

在这个数字化的时代&#xff0c;硬盘里的数据对我们来说简直太重要了。但糟糕的是&#xff0c;数据丢失这种事时不时就会发生&#xff0c;可能是因为不小心删了&#xff0c;硬盘坏了&#xff0c;或者中了病毒。遇到这种情况&#xff0c;很多人可能就慌了&#xff0c;不知道怎么…

货架管理a

路由->vue的el标签->Api->call方法里calljs的api接口->数据声明const xxxData-> 编辑按钮:点击跳出页面并把这一行的数据给到表单formDataba2 保存按钮:formDataba2改过的数据->xxApi发送->查询Api 跳转仓库:把tableData.value数据清空->callXxxAp…