Vue使用ajax 关于axios遇到乱码等问题的那些坑
程沛权2018/9/6 01:46:00
本文最后更新于 6 年 2 个月前,部分内容可能不适合当前所有情况,仅供参考。
从 jQuery 刚转到 Vue 的时候,对 ajax 的替代方案是选择了 npm 上的 axios,理由也比较简单,两者的 api 相似,调用方式也很接近,过渡可以说是无缝吧,不过在做第一个项目的时候还是踩了个坑,特此记录下来。
先说一下遇到的那些坑:
移动端真机 post 乱码
这个情况当时是很懵逼的,因为在 PC 端,以及使用 Chrome 的移动端模拟器测试都一切正常,但到了真机上提交数据时,只要包含了中文,post 到服务端的结果永远是【銆愭姤鍚嶇粍鍒 】,至今还是不知道这个到底是什么鬼。
当时搜索了很多 issue,都是建议在 Content-Type 添加 charset 为 utf-8,但实测没什么用,最后还是老老实实回顾了一下英文的官方文档,发现这么一句话:
Alternatively, you can encode data using the qs library:
qs library?赶紧去查了一下 qs 之后,恍然大悟,于是引入了 qs,完美解决(这一点和当初 jQuery 就不一样,之前压根就没遇到这种情况 emm)。
解决方案
最后回顾一下 axios 的使用方法:
axios 官方文档 https://www.npmjs.com/package/axios qs 官方文档 https://www.npmjs.com/package/qs
# 安装axios和qs
npm i axios
npm i qs
//打开main.js,在全局引入
//注意这里axios和qs都不能用use,因为不属于Vue的插件,不带安装接口,得用prototype原型引入
//引入后,就可以在任意组件里使用this.$ajax去调用axios了,qs也是this.$qs
import axios from 'axios'
import qs from 'qs'
Vue.prototype.$ajax = axios
Vue.prototype.$qs = qs
//注意回调那里我是用了箭头函数提升了this,否则需要提前先设定一个变量把this存储起来
//get请求,注意是使用params
this.$ajax({
method: 'get',
url: '接口的地址',
params: {
param1: '接口参数…',
param2: '接口参数…',
param3: '接口参数…',
// ……
// 更多的参数,一般都是page页码,tpp每页数量等
},
responseType: 'json',
})
.then((response) => {
// 请求成功后执行的操作
// ...
})
.catch((error) => {
// 请求失败,一般都是返回对应的提示给用户
// ...
})
//post请求,注意是使用data和qs
this.$ajax({
method: 'post',
url: '接口的地址',
data: this.$qs.stringify({
param1: '接口参数…',
param2: '接口参数…',
param3: '接口参数…',
// ……
// 更多的参数,一般都是用户填写的数据、用户身份校验信息等
}),
responseType: 'json',
})
.then((response) => {
// 请求成功执行的操作
// ...
})
.catch((error) => {
// 请求失败,一般都是返回对应的提示给用户
// ...
})
目前主要就是上面这些,其他的扩展需求,等以后根据项目实际需要再陆续继续补充记录。