1.下载axios
cnpm install axios -S
2.新建request.js
import axios from 'axios';
import router from '../../router';
import qs from 'qs'; //传给后台的数据为form格式
import { Dialog } from 'vant';//这里使用了vant组件库
// 创建axios实例
const service = axios.create({
baseURL: 'URL', // api的base_url
timeout: 15000, // 请求超时时间
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },
// 请求头处理,设置传给后台的参数格式,有form和json格式,这样写是form格式,application/json是json格式
});
// request 拦截器
service.interceptors.request.use((config) => {
// 在发送请求之前z转换data格式
if (config.method === 'post') {
config.data = qs.stringify(config.data);//这一步就是通过qs将传给后台的数据格式设置为form格式
}
// 当通过登录接口后,会返回一个请求头数据,以后每个接口前面都要加这个请求头,用来判断是否登录
if (window.sessionStorage.getItem('tooken')) {
config.headers['x-auth-token'] = window.sessionStorage.getItem('tooken');
}
return config;
}, (error) => {
Dialog.confirm({
title: '提示',
message: '登录状态异常, 是否跳转到登录页?',
}).then(() => {
router.push('/login');
}).catch((error) => {
console.log(error);
});
});
// respone拦截器
service.interceptors.response.use((response) => {
// 通过登录接口以后会返回一个请求头参数,存储到session里面(浏览器关闭清空),用于后面的接口
if (response.headers['x-auth-token']) {
window.sessionStorage.setItem('tooken', response.headers['x-auth-token']);
}
if (response.data.code !== 0) {
Dialog.alert({ message: response.data.msg });
return Promise.reject(response);//response可以通过catch捕获信息
}
return response.data;
}, (error) => {
if (error.message) {
// 登录超时
if (error.message === 'Network Error') {
// Dialog.alert({message:'登录超时'})
router.push('/login');
}
}
// if (error.response.status === 404) {
// console.error('404错误!')
// } else {
// Dialog.alert({message: error.message})
// router.push( '/login' )
// }
return Promise.reject(error);
});
export default service;
3.在实际项目中使用
1.main.js中引入
import request from '@/api/request'
Vue.prototype.$axios = request
2.代码中使用
this.$axios({
url: 'url',
method: 'post',
data: {}
}).then(res => {
console.log(res.data)
}).catch(error=>{
console.log(error)
})
4.使用proxy解决跨域
1.在项目根目录下新建文件vue.config.js(vue-cli 3.0)
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080', //对应后台接口
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
如果是2.0则在config/index.js下的dev添加proxyTable
2.修改前面的request.js
// 创建axios实例
const service = axios.create({
baseURL: '/api', // 修改的这里!!!
timeout: 15000, // 请求超时时间
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' } // 请求头处理
})
3.重启项目
5.打包设置路径
上面这种在打包出来的index.html下看的访问接口路径是不对的,需要按以下代码重新修改一下baseUrl
// 创建axios实例
const service = axios.create({
baseURL: process.env.NODE_ENV === 'production' ? 'http://localhost:8088' : '/api', //process.env.NODE_ENV是node变量,production表示打包,testing表示测试
timeout: 15000, // 请求超时时间
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }, // 请求头处理
});