news 2026/4/22 22:10:10

蓝易云 - post为什么会发送两次请求?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝易云 - post为什么会发送两次请求?

在排查“POST 为什么会发送两次请求”时,先别急着怪前端或接口“抽风”。多数情况下是浏览器机制、跨域预检、重定向、重试策略、框架开发模式导致的“看起来发了两次”。下面按最常见的真实原因给你一套可直接落地的定位与修复思路。🙂


一、最常见原因总览(先对号入座)🧭

现象(你看到的“两次”)真正原因是否真的两次 POST典型触发条件
一次OPTIONS+ 一次POSTCORS 预检否(只有一次 POST)跨域 + 自定义头/JSON/非简单请求
POST后立刻又来一次POST/GET重定向(301/302/307/308)可能是URL 末尾斜杠、HTTP→HTTPS、网关跳转
页面刷新/回退后又提交浏览器表单重复提交直接<form>提交 + 刷新
开发环境一点击触发两次React StrictMode / 双调用React 18 开发模式副作用检查
网络抖动下重复到达客户端/代理重试axios/fetch 重试插件、网关重试、LB 重试
服务端日志显示两次,但前端只发一次网关/边缘层转发两次多层反向代理、错误重试、超时重投

二、第一大类:你以为“POST 两次”,其实是OPTIONS + POST(CORS 预检)✅

典型特征

  • Network 里看到:

    • 第一次:OPTIONS /api/xxx

    • 第二次:POST /api/xxx

  • 服务端如果没处理 OPTIONS,可能报 404/405

为什么会预检?

当跨域请求满足以下任一条件,就会触发预检:

  • Content-Type: application/json

  • 自定义 Header(如AuthorizationX-Token

  • 使用PUT/DELETE等非简单方法

关键点

OPTIONS不是重复 POST,它是浏览器的“放行询问”。真正业务请求仍然只有一次。


三、第二大类:重定向导致看起来发了两次(非常常见)🔁

典型场景 1:URL 末尾斜杠

  • 你请求:POST /api/login

  • 后端路由实际是:/api/login/

  • 服务端返回 301/302/308,让客户端再请求一次

典型场景 2:HTTP → HTTPS

  • 前端请求打到http://

  • 网关强制跳转https://

  • 结果同一次操作发生两次网络交互

关键区别(务实判断)

  • 如果第一次响应码是301/302/307/308,基本就锁定是重定向链路问题。

说明:301/302可能把 POST 变 GET(看客户端实现),307/308会保持方法不变,更像“POST 又来一次”。


四、第三大类:开发环境框架“帮你测稳定性”,结果你以为重复提交(React 最典型)🧪

现象

  • 只在开发环境出现

  • 生产环境正常

  • 点击一次,接口打两次

典型根因

React 18 开发环境StrictMode会对某些副作用(如useEffect)进行双调用,用于发现不纯逻辑。


五、第四大类:客户端/网关重试机制(真实的“两次 POST”)📡

常见触发条件

  • 你配置了 axios 重试插件(或业务封装自带重试)

  • 网关对5xx/超时做了重试

  • 负载均衡在上游超时后重投

你会看到什么?

  • 两次请求的参数完全相同

  • 间隔可能是几十毫秒到几秒

  • 第一次可能是timeout/502/504,第二次成功或再次失败


六、快速定位方法:一套“企业级”排查路径(不绕弯)🧠

1)先看 Network 里的请求方法

  • 如果是OPTIONS + POST:预检,不是重复提交

  • 如果是POST + POST:继续下一步

2)看第一次响应码

  • 301/302/307/308:重定向链路

  • 5xx/timeout:重试链路

  • 200也重复:多半是前端触发两次(事件绑定/StrictMode/重复点击)

3)对比两次请求的关键字段

建议你对比:

  • Request URL是否一致(是否跳转了 https / 加了斜杠)

  • Request Headers里的Origin(是否跨域)

  • Request Payload是否完全一致(是否重试或重复触发)

  • Timing间隔(极短多为前端触发,间隔固定多为重试策略)


七、建议加一招“终极兜底”:幂等设计(让重复请求也伤不到你)🧯

即使你把根因修了,线上仍可能因网络抖动/重试出现重复 POST。企业级做法是:

  • 给 POST 增加 Idempotency-Key(幂等键)

  • 服务端用 Redis/DB 记录已处理的 key

  • 重复请求直接返回第一次结果或拒绝

这相当于给业务上了“保险丝”:允许链路不完美,但结果必须可控


一张“原因—现象—验证点”速查表(建议收藏)📌

原因你看到的现象一眼验证点
CORS 预检OPTIONS + POST第一次方法是 OPTIONS
重定向POST 后再来一次第一次响应码 301/302/307/308
StrictMode开发环境两次生产环境不复现
重试间隔后重复第一次 timeout/5xx,或网关有 retry
重复点击/事件绑定手快或绑定两次点击一次触发两次 handler

如果你愿意把两次请求的 Network 截图(只要方法、状态码、URL、时间线即可)或贴出两条日志的requestId/traceId,我可以直接帮你把原因锁死到某一类,并给出对应的最短修复路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 17:49:15

315MHz与433MHz无线遥控接收解码Keil源程序及AD格式电路图详解

315/433MHZ无线遥控接收解码源程序 Keil源程序 含AD格式电路图手头有个老项目用到了315MHz遥控器收发方案&#xff0c;最近翻出来重新整理了下解码部分的代码。这种无线模块虽然传输速率低&#xff0c;但胜在成本够低&#xff0c;特别适合车库门、报警器之类的场景。咱们直接拆…

作者头像 李华
网站建设 2026/4/20 13:11:41

【Docker私有仓库拉取实战指南】:掌握企业级镜像管理的5大核心技巧

第一章&#xff1a;Docker私有仓库拉取的核心概念与意义在现代容器化应用部署中&#xff0c;Docker私有仓库扮演着至关重要的角色。它不仅提供了镜像存储与分发的能力&#xff0c;还增强了企业对镜像安全、访问控制和网络效率的管理。与公有仓库&#xff08;如Docker Hub&#…

作者头像 李华
网站建设 2026/4/18 10:06:46

开源社区贡献指南:参与VibeThinker后续版本开发

开源社区贡献指南&#xff1a;参与VibeThinker后续版本开发 在AI模型参数规模不断膨胀的今天&#xff0c;一个仅15亿参数的小模型却悄然在数学推理和算法编程领域崭露头角——这正是微博开源的 VibeThinker-1.5B-APP。它没有追逐“通用智能”的宏大叙事&#xff0c;而是另辟蹊径…

作者头像 李华
网站建设 2026/4/20 21:26:23

Docker日志暴增导致磁盘满载?快速定位并优化输出策略

第一章&#xff1a;Docker日志暴增现象的识别与影响在运行容器化应用时&#xff0c;Docker日志暴增是一个常见但容易被忽视的问题。当日志未加限制地持续写入&#xff0c;容器的日志文件可能迅速膨胀&#xff0c;占用大量磁盘空间&#xff0c;甚至导致宿主机磁盘满载&#xff0…

作者头像 李华
网站建设 2026/4/18 1:42:09

还在手动部署微服务?5个高并发场景下的Docker自动化脚本案例

第一章&#xff1a;微服务部署的挑战与Docker化转型在现代软件架构演进过程中&#xff0c;微服务因其高内聚、低耦合的特性被广泛采用。然而&#xff0c;随着服务数量的增长&#xff0c;传统部署方式暴露出环境不一致、依赖冲突、部署效率低下等问题。开发人员常遇到“在我机器…

作者头像 李华
网站建设 2026/4/21 13:12:46

Docker跨平台测试实战精要(专家20年经验倾囊相授)

第一章&#xff1a;Docker跨平台测试概述在现代软件开发中&#xff0c;确保应用程序在不同操作系统和环境中的一致性行为是质量保障的关键环节。Docker 通过容器化技术封装应用及其依赖&#xff0c;实现了“一次构建&#xff0c;随处运行”的理想模式&#xff0c;为跨平台测试提…

作者头像 李华