问题出现
在使用uniapp做小程序项目时接口请求总是出错,打开调试发现接口请求了两次,一次是options一次是get。options无返回值,get有返回值。之前对options有所了解,但具体导致的问题没出现过
问题原因
其实跨域分为 简单跨域请求和复杂跨域请求:
简单跨域请求是不会发送options请求的
复杂跨域请求会发送一个预检请求options
复杂跨域请求要满足以下:
1、请求方法不是get/head/post
2、post请求的content-type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
3、请求设置了自定义的header字段
我的接口请求中设置了自定义的header字段,且我的接口携带的参数逻辑是不允许两次请求的(后端每次接收到请求后,请求参数即失效,所以必须避免触发预检请求)
解决方法
1.可去除自定义header字段来解决
2.后端程序处理预检请求(如php语言中,判断如果是options请求则允许各种请求头,然后直接返回)
//处理跨域options预检请求
if($_server['request_method'] == 'options'){
//允许的源域名
header("access-control-allow-origin: *");
//允许的请求头信息
header("access-control-allow-headers: header1,header2");
//允许的请求类型
header('access-control-allow-methods: get, post, put,delete,options,patch');
return;
}
注意:(后端设置access-control-allow-headers: *后,实际测试时发现华为手机自带浏览器options还是失败,经了解部分浏览器不支持*,需要写明允许的header)
chome浏览器对于服务端返回的 access-control-allow-headers: * 不区分
如果是ie、火狐,360极速兼容模式, 则后台必须修改为 access-control-allow-headers: 自定义header1,自定义header2
目前评论:0