起因:
开发一款购物类商城app,它里边有一个砍价的功能,这个功能依靠app分享到微信端的特性,从而需要一个公众号的h5页面,这个页面我为了快速开发就使用cdn引入了 vue;
原理:
使用app分享功能,带上当前要砍价的商品的缩略图,标题,以及商品链接。生成一个分享出去的卡片;然后将这个链接在微信端打开,注意打开这个链接怎么构成的呢,提供一下我的个人思路,和我们团队的做法:在打开微信之前向服务器发起请求,拿到我们的微信公众号的砍价页面的地址,再拼接上我们砍价商品的id,在微信上打开我们的h5页面h5页面通过window.href截取到我们的商品id,再拿我们截取到的id去发起请求拿到商品的详细。问题:向微信服务器换取openid的时候我们的axios会先发送一个OPINTIO的预请求,这个预请求是为什么会发起的呢??因为我们的axios是基于http请求和promise上二次封装的,http请求会针对我们的请求头和携带参数去判断我们的请求是不是 ' 非简单请求 ' ,来发起预请求的。而微信的服务器在判断我们连续向他发送两次请求的时候,认定我们是恶意请求,所以我们不得不避免这个预请求!!注意!!!!这里就涉及到了我们今天要讨论的怎么阻止我们的http请求去向服务器发起预请求了!!!
解决办法:
简单的说,避免发起预请求的办法就是,尽可能的将我们的请求都变成简单请求!!
第一步:改变我们的请求头。
我们原来的写法:
Content-Type: application/json : 请求体中的数据会以json字符串的形式发送到后端
这种请求头,直接就将请求变作了非简单请求了(具体区分办法请搜索:阮一峰 cors);
改变后的写法:
Content-Type: application/x-www-form-urlencoded:请求体中的数据会以普通表单形式(键值对)发送到后端
Content-Type: multipart/form-data: 它会将请求体的数据处理为一条消息,以标签为单元,用分隔符分开,既可以上传键值对,也可以上传文件。
第二步:改变我们携带参数的方法
1、可以使用qs序列化传参。
2、可以使用我们的formdata传参;
使用qs我就不多加赘述了,直接说一下用formdata这个办法:
//新建一个formdata对象
var form=new formData();
//将我们的参数添加进去
form.append('key',value)
//再将我们的form对象当成参数传给后端就好了