前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >axios发送两次请求及遇到的坑

axios发送两次请求及遇到的坑

作者头像
honey缘木鱼
发布2019-11-21 15:09:08
4.1K0
发布2019-11-21 15:09:08
举报
文章被收录于专栏:娱乐心理测试娱乐心理测试

在以前的Vue项目商城中,使用axios组件做数据请求,在页面交互中发现会发送两次网络请求,因为没有造成什么影响,一直也没有追究原因。在一个新的项目中,需要加入请求头Token判断是否需要登录,因为后台没有做任何限制,在第一次请求时,后台就返回需要登录,那同事也不知道什么原因,一直说是请求没有传Token,百度才发现原因。

一.两次请求方式原因:

浏览器将CORS请求分成两类:简单请求 和 非简单请求。 1.请求方式: HEAD,GET,POST 2.请求头信息:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form--data、text/plain。

只有同时满足以上两个条件时,才是简单请求,否则为非简单请求。 非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

即:浏览器会首先使用 OPTIONS 方法发起一个预请求,判断接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始真正的请求。

因为我们项目中使用的是GET,POST请求,Content-Type使用默认:application/json;charset=UTF-8。所以会发送一次预请求和一次正式请求两次请求。

二.解决方法

1.前端把非简单请求改为简单请求。 我们把Content-Type使用默认:application/json;charset=UTF-8。修改为application/x-www-form-urlencoded,即可转化为简单请求,但是测了之后发现后台并不识别这种请求格式,需要数据格式转化。 (1). npm install qs (2).在main.js中引入qs模块

代码语言:javascript
复制
import qs from 'qs'
Vue.prototype.$qs = qs

(3).转化格式

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

注意:config.headers.Authorization携带了token的情况仍然是非简单请求。

2.服务期端直接通过“预检”请求,服务器新建拦截器,拦截所有请求,筛选所有Requset Method:OPTIONS的请求,不做任何处理直接返回即可。

推荐方法2,服务端拦截的方法!
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.两次请求方式原因:
  • 二.解决方法
  • 推荐方法2,服务端拦截的方法!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档