解决使用axios后POST请求会出现OPTIONS预请求问题

Vue 的作者尤雨溪几个月前发表了一篇博客,表示 vue-resource 将不再是官方推荐的库,建议大家以 axios 替代。由此,开始了使用 axios 的历程,但是实践发现每次POST请求,都会先发送一个OPTIONS的请求,然后再发送正常的POST请求。

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

也就是说,它会先使用options去测试,你这个接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始正常请求。

关于这个问题,需要在后台接口进行设置,允许options请求,不然你的请求就会受到影响。如果请求方式为options,告诉它可以通讯,其他直接什么都不做。

那么问题来了,怎么避免额外发送options请求的问题?
  
1、Vue 使用,只需要把格式为json的参数用qs插件转换一下就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 第一步:安装qs
npm install qs

// 第二步:main.js
import axios from 'axios'
import qs from 'qs'

Vue.prototype.$http = axios
Vue.prototype.$qs = qs

// 第三步:(页面调用)
this.$http({
method: 'post',
url: 'http://localhost:3000/user/login',
data: this.$qs.stringify({
account: 'xugang',
passwd: '123456',
email: '371801080@qq.com'
})
}).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
原创技术分享,您的支持将鼓励我继续创作