二次封装axios
- 为什么要进行二次封装
api统一管理,不管接口有多少,所有接口都可以非常清晰,容易维护
开发项目一般有三个阶段
- 开发环境
- 测试环境
- 生产环境
不同环境访问接口的域名不同,直接修改域名,这就是封装请求的原因。
request.js
import axios from 'axios' import {Toast} from 'vant' // 环境的切换 if (process.env.NODE_ENV === 'development') { axios.defaults.baseURL = 'http://192.168.8.144:8082' // 开发环境 } else if (process.env.NODE_ENV === 'debug') { axios.defaults.baseURL = '' // 调试环境 } else if (process.env.NODE_ENV === 'production') { axios.defaults.baseURL = '' // 生产环境 } // axios.defaults.baseURL = 'http://192.168.8.144:8082' // 开发环境 axios.defaults.timeout = 10000 // 请求拦截器 axios.interceptors.request.use( config => { console.log('-===============') config.headers = { //'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8' //配置请求头 'Content-Type': 'application/x-www-form-urlencoded' //配置请求头 } if (localStorage.getItem('Authorization')) { config.headers.Authorization = localStorage.getItem('Authorization');//请求携带token } return config; }, error => { return Promise.error(error) }) // 响应拦截器 axios.interceptors.response.use( response => { if (response.status === 200) { return Promise.resolve(response) } else { return Promise.reject(response) } }, // 服务器状态码不是200的情况 error => { if (error.response.status) { switch (error.response.status) { // 401: 未登录 // 未登录则跳转登录页面,并携带当前页面的路径 // 在登录成功后返回当前页面,这一步需要在登录页操作。 case 401: this.$router.replace({ path: '/Login', }) break; // 403 token过期 // 登录过期对用户进行提示 // 清除本地token和清空vuex中token对象 // 跳转登录页面 case 403: Toast({ message: '登录过期,请重新登录', duration: 1000, forbidClick: true }) // 清除token localStorage.removeItem('Authorization') // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 setTimeout(() => { this.$router.replace({ path: '/Login', }) }, 1000) break; // 404请求不存在 case 404: Toast({ message: '网络请求不存在', duration: 1500, forbidClick: true }) break; // 其他错误,直接抛出错误提示 default: Toast({ message: error.response.data.message, duration: 1500, forbidClick: true }) } return Promise.reject(error.response) } } ) /** *get 方法,对应get请求 *@param {String} url [请求的url地址] *@param {Object} params[请求携带的参数]] */ export function get(url, params) { return new Promise((resolve, reject) => { axios.get(url, { params: params }).then(res => { resolve(res.data); }).catch(err => { reject(err.data); }) }); } /** *post 方法,对应post请求 *@param {String} url [请求的url地址] *@param {Object} params[请求携带的参数]] */ export function post(url, params) { return new Promise((resolve, reject) => { axios.post(url, params) .then(res => { resolve(res.data); }).catch(err => { reject(err.data); }) }); } /** *封装patch请求 *@param url * @param params * @returns {Promise} */ export function patch(url, params) { return new Promise((resolve, reject) => { axios.patch(url, params) .then(res => { resolve(res.data); }, err => { reject(err); }) }) } /** *put 请求 *@param url * @param params */ export function put(url, params) { return new Promise((resolve, reject) => { axios.put(url, params) .then(res => { resolve(res.data); }, err => { reject(err); }) }) }
api.js
import {post} from './request' export const postPublic = params =>post('/getPublicKey',params) export const postRegist = params =>post('/regist',params) export const postLogin = params =>post('/login',params)
login.vue
import {postPublic, postRegist, postLogin} from '../utils/api' function getPublic() { console.log('------') let params = {} let publicKey = '' postPublic(params).then((res) => {if (res.code == '200') { publicKey = res.data.publicKey state.uuid = res.data.uuid setKey(publicKey) } }) }