解决axios发送OPTIONS预检请求及数据格式转换方案

作者:松果

时间:2026-10-22

浏览:425

本文分析axios默认使用application/json时触发浏览器OPTIONS预检请求的原因,探讨通过修改请求头为application/x-www-form-urlencoded规避预检的方案,并介绍使用qs模块转换数据格式以兼容后端接口的具体实现步骤。

文章目录

axios发送两次请求的原因分析

问题描述:

在Vue开发中,axios是常用的数据交互库,其默认设置的请求头Content-Type为application/json。

采用该默认请求头配置时,可能会观察到向服务器发送两次请求的现象。

造成这一现象的原因如下:

当请求包含非简单方法(如POST)或特定Content-Type时,浏览器会先发送一个OPTIONS方法的预检请求(Preflight Request),用于验证服务器是否允许该跨域请求。若预检通过,浏览器才会发送实际的HTTP请求;若预检失败,则不会发送真实请求。

其交互逻辑大致如下:

浏览器询问服务器是否允许特定请求,服务器返回允许后,浏览器发送实际的GET或POST请求;若服务器拒绝,则前端报错。

这种机制导致每个符合条件的请求都会产生两次网络交互,增加了服务器的负载。虽然常见的解决方案是配置服务器允许OPTIONS请求,但这仅解决了跨域验证问题,并未消除预检请求本身,服务器仍需处理额外的OPTIONS请求。

如何解决这个问题?不允许浏览器请求,只发送真正的请求,我也没解决,如果有已经解决的朋友可以告诉我解决方法~( ̄3 ̄)~

不过,

存在一种替代性的处理思路。

可以在main.js文件中,将axios的默认请求头Content-Type修改为application/x-www-form-urlencoded。

通过修改请求头规避预检请求

然而,新的问题随之产生:

axios发送两次请求的原因分析

后端接口可能无法直接识别这种数据格式。

因此,在发送请求前,必须对传递的数据进行格式转换。

此时,可以借助qs模块来完成数据序列化工作。

使用qs模块转换数据格式

首先执行 npm install qs 安装该模块。

接着在main.js中进行配置:

引入qs模块。

import qs from 'qs

将qs挂载到Vue原型上,以便全局调用。

Vue.prototype.$qs = qs

通过上述配置,在发起axios POST请求时,利用qs将数据转换为后端可识别的表单格式,从而避免复杂的预检流程。


this.$axios
   .post("http://xxx/", 
    this.$qs.stringify(postData)
   ).then(data => {
    if (data.data.status != 200) {
     //xxx
    } else {
     //xxx
    }
   });

总结

以上介绍了处理axios发送两次请求及OPTIONS预检请求的相关方法与数据格式转换技巧,希望能为读者提供有益参考。如有任何疑问,欢迎留言交流,小编将及时回复。感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章