2019独角兽企业重金招聘Python工程师标准>>>
- 实际需求中经常会碰到想异步请求代码写的像同步一样简洁,解决回调地狱,这是最近封装的一个。
// import qs from 'qs';
import axios from 'axios'
import utils from './util'
import { Toast, Dialog } from 'mand-mobile'
import store from '@/store'
import config from '../config/index'let baseUrl = config.baseUrl // 设置你的baseUrlconst CancelToken = axios.CancelToken
const source = CancelToken.source()
// 设置token
function setToken () {if (utils.local.get('token')) {axios.defaults.headers.common['token'] = utils.getLocal('token');}
}// 请求验证拦截器
axios.interceptors.request.use(config => {// Toast是示例代码,实际需要根据自己的编写// Toast.loading('加载中...')return config
})
axios.interceptors.response.use(res => {// 此段为公司的业务代码,可根据自己的实际情况编写// Toast.hide()// const code = res.data.error_code// const msg = res.data.error_msg// if (code !== '0000') {// if (code == '1001') {// location.href = '/#/login'// } else {// Dialog.confirm({// title: '提示',// content: msg,// confirmText: '确定',// onConfirm: () => console.log('[Dialog.confirm] confirm clicked'),// })// }// }return res.data
})//封装请求方法
function formatReq(type, url, data) {const tempObj = new FormData()for(let i in data) {tempObj.append(i, data[i])}tempObj.append('token', store.state.token)setToken()return new Promise((reslove, reject) => {axios({method: type,url: `${baseUrl}${url}`,// headers: {// //这里的请求头与后台商量设置// // 'content-Type': 'application/x-www-form-urlencoded'// 'content-Type': 'application/x-www-from-urlencoded'// },cancelToken: source.token,// data: qs.stringify(data) //java后台用qs转// data:JSON.stringify(data)//PHP后台用JSON转data: tempObj//PHP后台用JSON转}).then(r => {// store.commit('UPDATE_LOADING', false); //隐藏loading//这里可以添加指定对应状态码的处理方式,比如登陆过期,res.data.code === '6666' 路由跳转到loginreslove(r);}).catch(e => {// store.commit('UPDATE_LOADING', false); //隐藏loadingreject(e.message);});});
}const Http = {get: (url, query) => {url = utils.formatUrl(url, query)setToken();return axios.get(`${baseUrl}${url}`, { cancelToken: source.token }).then(r => r);},post: (url, data) => formatReq('post', url, data),put: (url, data) => formatReq('put', url, data),patch: (url, data) => formatReq('patch', url, data),delete: (url, data) => formatReq('delete', url, data)
};export default Http;//处理get请求,传入参数对象拼接
// let formatUrl = (url, obj) => {
// let params = Object.values(obj).reduce((a, b, i) => `${a}${Object.keys(obj)[i]}=${b}&`, '?');
// return `${url}${params.substring(0, params.length - 1)}`;
// };// 使用示例
// methods: {
// async login() {
// let loginInfo = await this.http.post('/api/login/doLogin', this.loginInfo)
// const token = loginInfo.data.token
// // 提交mutation 保存token
// this.$store.commit('updateToken', token)
// this.COOKIE.set('token', token)
// Toast.succeed('登录成功')
// setTimeout(() => {
// this.$router.push('/')
// }, 300)
// }
// }