axios安装可参考官网,这里就不多说了,还是直接进入正题
vue中如何封装axios以及如何使用?
首先在src/api下新建service.js,具体代码如下:
import axios from 'axios';
import { Message,MessageBox } from 'element-ui';
import store from '../store';
import { baseUrl } from 'config'
// import { getToken } from '';
window.temp=true;
axios.defaults.withCredentials=true;//让ajax携带cookie
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
// 创建axios实例
const service = axios.create({
// baseURL: process.env.BASE_API, // api的base_url
timeout: 300000, // 请求超时时间
/***如果qs没有stringify,将下面方法打开才能提交form,只在post时生效 **/
transformRequest: [function (data) {
// Do whatever you want to transform the data
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
// console.log("ret");
// console.log(ret);
return ret;
}]
});
// request拦截器
service.interceptors.request.use(config => {
let token = store.getters.token;
// console.log(token)
if (store.getters.token) {
config.headers['X-Token'] = token; // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
}
config.headers['X-SysCode'] = 'stfinance'; //让每个请求携带SysCode,请根据实际情况自行修改
return config;
}, error => {
// Do something with request error
console.log(error); // for debug
Promise.reject(error);
})
/**=======================================**/
// respone拦截器
service.interceptors.response.use(
// response => response,
/**
* 下面的注释为通过response自定义code来标示请求状态,当code返回如下情况为权限有问题,登出并返回到登录页
* 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中,
*/
response => {
// return response.data;
// console.log({response})
const res = response.data;
if (res.code !== 200) {
Message({
message: res.msg,
type: 'error',
duration: 5 * 1000
});
}
// 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了;
if (res.code === 503) {
if(window.temp){
window.temp=false;
MessageBox.confirm('你的会话已失效', '确定登出', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
window.temp=true;
window.clearInterval(window.interval); //清除计时器
sessionStorage.removeItem('userInfo'); //清除用户信息
store.commit('logOut'); //注销
location.reload(); // 为了重新实例化vue-router对象 避免bug
}).catch(() => {
});
}
}
return response.data;
},
/**接口交互错误是处理,如果特殊错误,可对message进行修改**/
error => {
// console.log(error.response.code);// debug
let message = error.message;
console.log(error);
if (error.response.code == 500) {
message = "请求异常";
}
if (error.response.code == 504) {
message = "服务器异常";
}
if (error.response.code == 404) {
message = "找不到服务内容";
}
/**错误弹框,仅在element-ui适用,如果使用其他前端框架(如手机端的),要相应进行修改**/
Message({
message: message,
type: 'error',
duration: 5 * 1000
});
return Promise.reject(error);
}
)
export default service;
如果你希望生产环境和开发环境使用不同上下文的话可以在src/api下新建两个文件config.dev.js和config.prod.js,
config.dev.js代码如下:
export const baseUrl = "/project-dev"
config.prod.js代码如下:
export const baseUrl = "/project-prod"
注意:此时需在config/index.js文件配置两个代理环境,具体配置如下:
const path = require('path')
module.exports = {
dev: {
// Paths
env: require('./dev.env'),
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/project-dev': {
target: 'http://58.100.1.101:8080/', //开发环境
changeOrigin: true,
pathRewrite: {
'^/project-dev': '/project-dev'
}
},
'/project-prod': {
target: 'http://www.xxxxx.com/', //生产环境
changeOrigin: true,
pathRewrite: {
'^/project-prod': '/project-prod'
}
},
},
// Various Dev Server settings
host: '', // can be overwritten by process.env.HOST
port: 8090, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
},
build: {
env: require('./prod.env'),
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/project/',
/**
* Source Maps
*/
productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production
//devtool: '#source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
},
cssSourceMap: false
}
然后在src/api下新建login.js,具体代码如下:
import service from './service'
import { baseUrl } from 'config'
//登录
export function login(data) {
let uri = baseUrl+'/user/login';
return service ({
url: uri,
method: 'post',
data: data
});
}
此时可以在项目里调用之前封装的axios实例对象,具体引用如下:
import * as api from "@/api/login";
api.login({user:'user',password:'123456'}).then(res=>{
if(res.code==200){
//你需要做的事情
}
})