关于axios会发送两次请求,有个OPTIONS请求的问题

当时项目为了解决这个问题自闭了一个下午.....上网找了不少的文章看,几乎都没有根治方法,可是最后仍是被我搞定了
[]~( ̄▽ ̄)~* ios

问题描述:

Vue的开发者都知道axios,不少都用axios来进行数据交互,axios的默认请求头是Content-Type: application/json
使用这个请求头会出现向服务器请求两次的状况
为何呢?npm

缘由是:浏览器会首先使用 OPTIONS 方法发起一个预请求,判断接口是否可以正常通信,若是不能就不会发送真正的请求过来,若是测试通信正常,则开始真正的请求。json

大概意思就是:
浏览器对后台说:我能够请求你吗? ( ̄ˇ ̄) 
后台说:阔以。( ̄▽ ̄)~*
结果是:发送原有的POST请求
后台说:不阔以。(‵﹏′)
结果是:报错axios

那么这样每一个请求都会发送两次,无形加剧了服务器的负担(若是服务器特厉害就当我没说),网上有的解决办法是让后台容许options请求,可是并不返回任何数据,那么就不会报错,但是这样治标不治本,浏览器仍是来撩后台了,只是后台不让撩而已。
如何解决这个问题?不容许浏览器请求,只发送真正的请求,我也没解决,若是有已经解决的朋友能够告诉我解决方法
~( ̄3 ̄)~浏览器

可是!

我有能够替代的方法
那就是在main.js中,设置axios的默认请求头axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';服务器

但是问题又来了

图片描述后台不认这个数据格式啊...app

因此在传递的时候必须先把数据转换格式post

这时候咱们须要用到qs模块
npm install qs测试

在main.js中

引入qs模块this

import qs from 'qs

而后弄qs原型

Vue.prototype.$qs = qs

这样咱们就能够在axios post请求的时候将咱们传递的数据转换成后台认识的格式

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

这样就完美解决问题,减小了对服务器的请求,减轻了对服务器的压力,最重要的是可!以!传!

若是有什么疑问欢迎留言,有错误或者有更简单的方法欢迎大力指出

相关文章
相关标签/搜索