Axios 执行post发送两次请求的小坑

vue-resource2.0已经不再更新,所以vue2.0官方推荐使用axios来代替。
实际项目也是应用上了vue+axios,然后就有了这么一段填坑的经历。

问题:axios使用post请求时,发送了两次,而get则正常。
第一次请求不是正确的post请求,第二次才是正确的

调出谷歌开发者工具

image.png

“Request Method: OPTIONS”
什么鬼,post请求时,这里的“Request Method”居然不是post,而是这个OPTIONS。注意:它还是额外发送的。

项目中采用前后端分离的开发方式,前端通过调用后端API实现数据传输。
后端同学则通过反向代理解决了前端跨域的问题。(前端调接口跟在同域下使用时一样,该怎么用怎么用)

找到原因:其实这个情况并非bug,而是当项目中有用到跨域请求时,除了get方式的http请求,都会发送一个预检请求。

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
相关资料https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_C

解决方案:只能麻烦后端同学帮忙处理下

header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Headers:content-type");
header("Access-Control-Request-Method:GET,POST");
if(strtoupper($_SERVER[‘REQUEST_METHOD‘])== ‘OPTIONS‘){
  exit;
}

后端遇到请求方式是“Request Method: OPTIONS” 时,直接返回或退出即可,不再往下执行程序。
上述header的设置用的是PHP的设置方法,在Web服务器端,如nginx, apache也可以对header进行设定。

时间: 2024-10-07 02:26:24

Axios 执行post发送两次请求的小坑的相关文章

axios发送两次请求原因及解决方法

axios发送两次请求原因及解决方法 最近Vue项目中使用axios组件,在页面交互中发现axios会发送两次请求,一种请求方式为OPTIONS,另外一种为自己设置的. 如图: 什么是CORS通信? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制. CORS需要浏览器和服务器同时支持.目前,所有浏览器都支持该功能,IE浏

JavaScript中一个方法同时发送两个ajax请求问题

今天在做项目中遇到一个问题,大概是在一个jsp页面同时有一个select下拉搜索条件框和一个Bootstrap表格展示列表.这两个都要通过ajax向后台拿数据,而且要在页面加载时完成.当时的做法是: $(function() { // 加载下拉菜单 selectMenu(); /** 加载页面表格 */ var url = 'xxxx.do'; var col = [ { checkbox : true }, { field : 'operlogid', title : 'xxx', forma

为什么请求会发送两次-预检请求opition

我们都知道cors请求分类两类:简单请求get,post,option:其他是复杂请求. 详情查看 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 场景:很多时候发送一个post请求,结果却显示两个请求(一个option请求,一个post请求) 一.什么是options请求 OPTIONS请求即预检请求,用来检测服务器允许的http方法. 总共会发送两次请求.当发起跨域请求时,出于安全考虑,达到一定条件,

Webpack运行后,XMLHttpRequest发送带参请求,后台$_POST没有数据

环境: 打包工具: Webpack: 整合软件包: WAMP: 编辑器:VsCode: Webpack虚拟出的端口号是8080,本地Apache的端口号是80 问题重现: JS代码,使用FormData对象作为传输数据的格式: function postData() { var formData = new FormData(); formData.append("data", JSON.stringify({name:'xxx', age:20})); function xhrReq

解决vue axios跨域请求发送两次问题

问题: vue axios跨域请求,在Request Headers加Authorization传递Token时,发现统一请求触发了两次,第一次是Request Method: OPTIONS请求. 原因: 跨域请求时,浏览器会首先使用OPTIONS方法发起一个预请求,判断接口是否能够正常通讯.如果通讯异常,则不会发送真正的请求,如果测试通讯正常,则开始真正的请求. 解决方法: 后台:判断请求方式是OPTIONS,则不处理: 预请求 发送真正请求  PHP解决方法 class Common ex

vue 中使用 axios 请求接口,请求会发送两次问题

在开发项目过程中,发现在使用axios调用接口都会有两个请求,第一个请求时,看不到请求参数,也看不到请求的结果:只有第二次请求时才会有相应的请求参数以及请求结果: 那为甚么会有这么一次额外的请求呢,后面经过查证资料发现: 如果只是普通的 ajax 请求,也不会发起这个请求,只有当 ajax 请求绑定了 upload 的事件并且跨域的时候,就会自动发起这个请求了.这样就很显然了,我们有 upload 事件绑定(一般都是本地调试,所以会有跨域),看了下 axios 文档,发现config配置文件中有

chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常

调查一个 pdf 打印报错: ExceptionConverter: org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:407)

为什么axios请求接口会发起两次请求

之前在使用axios发现每次调用接口都会有两个请求,第一个请求时option请求,而且看不到请求参数,当时也没注意,只当做是做了一次预请求,判断接口是否通畅,但是最近发现并不是那么回事. 首先我们知道了额外的一次请求时option请求,那么这个是干嘛用的呢? 如果只是普通的 ajax 请求,也不会发起这个请求,只有当 ajax 请求绑定了 upload 的事件并且跨域的时候,就会自动发起这个请求.详细看http://www.tuicool.com/articles/3UBzIbb. 这样就明了了

浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?

最近,个人官网实现了PDF下载功能,出于统计的考虑,增加了"下载次数"download_count这个字段. 但是,我今天突然发现,每次下载download_count都直接+2了.如果服务器发生这种事,还有一定的可能,本地就我一个人下载,怎么可能下载2次.于是,打开了log4j的debug模式,果然执行了2次更新请求. @RequestMapping(value = "/download/pdf") public void downloadPdf(@Request