请谈谈 HTTP 中的请求方法(GET、POST、PUT、DELETE等),它们的区别是什么?

一、HTTP方法核心概念

HTTP请求方法是客户端向服务器表达操作意图的核心标识,遵循RFC 7231等规范定义。

正确使用方法可提升API语义清晰度,降低前后端协作成本。以下是常见方法特性对比表:

方法幂等性安全性请求体支持典型应用场景
GET获取资源列表/详情
POST创建资源/触发复杂操作
PUT全量替换资源
DELETE删除指定资源
PATCH部分更新资源
二、核心方法详解与代码示例
1. GET:安全的数据获取
// 获取用户列表(带查询参数)
async function fetchUsers(page = 1) {const query = new URLSearchParams({ page })const response = await fetch(`/api/users?${query}`)if (!response.ok) {throw new Error(`获取失败: ${response.status}`)}return response.json()
}

安全实践

  • 避免在URL中传递敏感参数(会被浏览器历史记录)
  • 对数组参数进行编码处理:ids[]=1&ids[]=2
2. POST:非幂等的资源创建
// 创建新用户(带CSRF保护)
async function createUser(userData) {const csrfToken = document.querySelector('meta[name="csrf-token"]').contentconst response = await fetch('/api/users', {method: 'POST',headers: {'Content-Type': 'application/json','X-CSRF-Token': csrfToken},body: JSON.stringify(userData)})if (response.status === 201) {return response.headers.get('Location') // 获取新资源路径}const error = await response.json()throw new Error(error.message)
}

开发陷阱

  • 多次点击提交按钮会导致重复创建(需前端防抖+服务端幂等校验)
  • 文件上传需使用multipart/form-data格式
3. PUT:幂等的全量替换
// 更新用户全部信息
async function updateUser(userId, newData) {const response = await fetch(`/api/users/${userId}`, {method: 'PUT',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(newData)})if (response.status === 204) {  // 204 No Content常见响应return true}if (response.status === 409) {  // 版本冲突处理return handleConflict(await response.json())}throw new Error('更新失败')
}

注意事项

  • 要求客户端传递完整资源对象
  • 需配合ETagLast-Modified处理并发冲突
4. DELETE:资源删除操作
// 带确认的删除操作
async function deleteResource(resourceId) {if (!confirm('确定删除?')) returnconst response = await fetch(`/api/resources/${resourceId}`, {method: 'DELETE'})if (response.status === 204) {showToast('删除成功')refreshList()} else if (response.status === 403) {showError('权限不足')}
}

特殊场景

  • 软删除建议返回200+状态字段而非204
  • 批量删除推荐使用POST + 请求体(避免URL长度限制)
三、高级方法实战应用
1. PATCH:部分更新
// 使用JSON Patch格式
async function updateUserEmail(userId, newEmail) {const patch = [{ op: 'replace', path: '/email', value: newEmail }]const response = await fetch(`/api/users/${userId}`, {method: 'PATCH',headers: { 'Content-Type': 'application/json-patch+json' },body: JSON.stringify(patch)})// 处理422 Unprocessable Entity验证错误
}

规范建议

  • 使用标准格式:JSON Patch(RFC 6902)或JSON Merge Patch
  • 避免在数组中指定索引(易引发并发问题)
2. OPTIONS:预检请求处理
// CORS预检请求处理示例
app.options('/api/*', (req, res) => {res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization')res.status(204).end()
})

性能优化

  • 设置Access-Control-Max-Age减少预检次数
  • 避免在Authorization头携带过大token
四、常见误区与最佳实践
1. 方法误用反模式
// 错误示例:用GET执行删除操作
fetch(`/api/users/123?action=delete`, { method: 'GET' })// 正确做法:使用DELETE方法
fetch(`/api/users/123`, { method: 'DELETE' })

风险点

  • 搜索引擎爬虫可能触发危险操作
  • 浏览器预加载可能导致意外执行
2. RESTful API设计规范
// 资源嵌套路由示例
POST /articles/123/comments  // 创建评论
GET  /articles/123/comments  // 获取评论列表
PUT  /articles/123/comments/456  // 更新指定评论

设计原则

  • 使用名词而非动词定义端点
  • 版本控制通过Header或URL路径实现(如/v1/resource
3. 幂等性保障机制
// 支付接口幂等处理(使用唯一ID)
async function processPayment(orderId, idempotencyKey) {const response = await fetch('/api/payments', {method: 'POST',headers: {'Idempotency-Key': idempotencyKey  // 服务端存储该Key保证幂等},body: JSON.stringify({ orderId })})// 处理409 Conflict重复请求
}

实现方案

  • 服务端存储请求指纹(方法+路径+参数+Key)
  • 客户端生成UUID作为幂等Key
五、调试与性能优化
  1. Network面板分析

    • 查看请求方法列确认是否误用
    • 过滤method:POST快速定位提交请求
  2. 性能优化策略

// 批量操作使用PATCH代替多个PUT
const bulkUpdate = [{ id: 1, op: 'replace', path: '/name', value: 'Alice' },{ id: 2, op: 'remove', path: '/address' }
]fetch('/api/users/bulk', {method: 'PATCH',body: JSON.stringify(bulkUpdate)
})
  1. 自动化测试验证
// 使用Jest测试方法合规性
test('用户创建必须使用POST方法', async () => {const response = await app.inject({method: 'PUT',url: '/api/users',payload: mockUserData})expect(response.statusCode).toBe(405) // Method Not Allowed
})
六、总结与团队规范建议
  1. 强制规范

    • 敏感操作禁止使用GET方法
    • 更新操作严格区分PUT/PATCH语义
  2. 协作流程

    • API文档必须明确每个端点的允许方法
    • 使用Swagger/OpenAPI生成交互式文档
  3. 监控报警

    • 对405 Method Not Allowed进行监控
    • 统计非常用方法(如HEAD/OPTIONS)的调用频率
  4. 安全加固

    • 严格限制TRACE/CONNECT方法
    • 对敏感接口启用双重认证(如删除操作)

参考资料:

  • RFC 7231: HTTP/1.1 Semantics and Content
  • RESTful Web APIs by Leonard Richardson
  • OWASP REST Security Cheat Sheet

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

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

相关文章

MySQL增量更新数据:高效同步策略与PanguSync实战指南

Mysql增量更新数据软件下载https://pan.baidu.com/s/1WesHaKGO7uQMhPNE-BTDmg?pwdabcd#list/path%2F 在数据驱动的商业环境中,实时数据同步已成为企业数字化转型的关键。本文将深入探讨MySQL增量更新的核心技术,并详细解析如何通过PanguSync工具实现高…

无人机灯光原理与应用解析!

工作原理 LED光源:LED因其高效、长寿命、高亮度和轻便等优点,成为无人机灯光的主要光源。 电路控制:通过微控制器或飞行控制器调节电流,控制灯光的开关、亮度和颜色。 信号传输:灯光控制信号通过无线或有线方式从遥…

51c自动驾驶~合集52

我自己的原文哦~ https://blog.51cto.com/whaosoft/13383340 #世界模型如何推演未来的千万种可能 驾驶世界模型(DWM),专注于预测驾驶过程中的场景演变,已经成为追求自动驾驶的一种有前景的范式。这些方法使自动驾驶系统能够更…

lamp平台介绍

一、lamp介绍 网站: 静态 动态 php语言 .php 作用:运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…

ROM修改进阶教程------修改安卓机型SELinux宽容的几种方式方法 以及第三方系统中如何关闭SELinux宽容

SELinux是一种强制访问控制安全机制,用于增强Linux系统的安全性。在某些情况下,可能需要对 SELinux 进行宽容设置,以满足特定的应用需求。当SELinux处于宽容模式时,系统允许违反安全策略的行为发生,但不会阻止这些行为,通常会在日志中记录这些违规事件。这与强制模式不同…

如何在 Aptos 上铸造 NFT

今天文章的第一部分将演示如何在 Aptos 上铸造 NFT,并使用 Moralis 轻松获取所有交易详细信息。在这里,我们将指导您完成使用 Aptos CLI 铸造活动门票 NFT 基本代币的过程。您还将了解如何完成初始设置步骤。此外,您还将了解如何获取 Moralis…

Springboot 梳理

一、Springboot 特性 方便创建可独立运行的spring应用程序直接内嵌Tomcat等服务简化了项目的构建配置为spring及第三方库提供自动配置提供生产级特性无需生成代码或者进行xml配置 二、四大核心 自动配置起步依赖命令行界面Actuator - 生成级的特性 三、自动配置的实现原理 …

C语言学习笔记-初阶(30)深入理解指针2

1. 数组名的理解 在上一个章节我们在使用指针访问数组的内容时,有这样的代码: int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这里我们使用 &arr[0] 的方式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址&…

【Kubernetes 指南】基础入门——Kubernetes 基本概念(三)

三、Node 1、Node 简介 - Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。 - 为了管理 Pod,每个 Node 节点 上至少要运行 container runtime( 比如 docker 或者 rkt )、kubelet 和 kube-proxy 服务。 2、…

电源测试系统有哪些可以利用AI工具的科技??

AI技术的发展对电源模块测试系统的影响是深远的,不仅协助系统提升了测试效率和精度,还推动了测试方法的创新和智能化。那么在电源测试系统中哪些模块可以利用AI工具实现自动化测试? 1. 自动化测试与效率提升 智能测试流程优化 AI算法可以自动优化测试…

解决Spring Boot中LocalDateTime返回前端数据为数组结构的问题

在Spring Boot开发中,处理日期时间数据是一个常见的需求。Java 8 引入了新的日期时间API,如LocalDateTime,它提供了更强大的日期时间处理功能。然而,在将LocalDateTime对象序列化为JSON时,可能会遇到返回为数组结构的问…

Redis---缓存穿透,雪崩,击穿

文章目录 缓存穿透什么是缓存穿透?缓存穿透情况的处理流程是怎样的?缓存穿透的解决办法缓存无效 key布隆过滤器 缓存雪崩什么是缓存雪崩?缓存雪崩的解决办法 缓存击穿什么是缓存击穿?缓存击穿的解决办法 区别对比 在如今的开发中&…

IntelliJ IDEA 2024.3.4 版本无法正常加载maven项目

报错如下: Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://192.168.22.76:9003/repository/thirdparty/ - Check that Maven pom files do not co…

Select 下拉菜单选项分组

使用<select>元素创建下拉菜单&#xff0c;并使用 <optgroup> 元素对选项进行分组。<optgroup> 元素允许你将相关的 <option> 元素分组在一起&#xff0c;并为每个分组添加一个标签。 <form action"#" method"post"><la…

靶场(二)---靶场心得小白分享

开始&#xff1a; 看一下本地IP 21有未授权访问的话&#xff0c;就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…

【JavaScript — 前端快速入门】 JavaScript 引入方式

JavaScript 1. JavaScript 介绍 1.1 什么是JavaScript? 最初在网景公司&#xff0c;该语言命名为 LiveScript&#xff0c;当时网景公司认为&#xff0c;Java 作为当时最流行的编程语言&#xff0c;带有 “Java” 的名字有助于这门新生语言的传播&#xff0c;将 LiveScript 命名…

5c/c++内存管理

1. C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);i…

vulnhub靶场之【digitalworld.local系列】的mercy靶机

前言 靶机&#xff1a;digitalworld.local-mercy&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机选择使用VMware打开文件&#xff0c;都选择桥接网络 这里官方给的有两种方式&#xff0c;一…

SqlSugar 语法糖推荐方式

//方式1&#xff1a;var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2&#xff1a;不推荐使用&#xff0c;建议优先使用 Lambda 表达式&#xff0c;因为它更…

unity学习63,第2个小游戏:用fungus做一个简单对话游戏

目录 1 目标用fungus做一个简单的剧情对话游戏 1.1 先创建一个新的3D项目 1.2 fungus是什么 1.2.1 怎么获得 1.2 在AssetStore里搜索fungus (插件类)--千万别买收费的错的&#xff01; 1.3 fungus的官网 1.3.1 官网给的3个下载链接&#xff0c;unity的果然已经失效了 …