一般現(xiàn)在請求接口都會使用axios,方便而且比較簡潔,下面總結(jié)了一套比較通用的請求方法以及報錯機制
代碼如下:
處理一遍數(shù)據(jù)結(jié)構(gòu)的then方法可以根據(jù)業(yè)務情況自行調(diào)整
import Axios from 'axios';
const axios = Axios.create({
timeout: 200000
})
function ajax(method, url, params) {
function r() {
if (method.toLowerCase() === 'get') {
return axios.get(url, {
params,
headers: {
'token': ''
},
})
} else if (method.toLowerCase() === 'post') {
return axios.post(url, params, {
headers: {
'token': ''
}
})
}
}
return r().then(res => { /
const data = res.data
// 先處理一遍數(shù)據(jù)結(jié)構(gòu)
if (
typeof data !== 'object' ||
typeof data.data === 'undefined' ||
typeof data.code === 'undefined' ||
typeof data.msg === 'undefined'
) {
throw `服務端返回數(shù)據(jù)格式不正確`;
} else {
return data;
}
}).then(data => {
// 再處理code錯誤碼
if (data.code !== 0) {
return Promise.reject(data); // 這個reject會返回給下面的catch
} else if (data.code === 0) {
return data.data;
}
}).catch(e => {
errorHandler(e);
throw e; // throw e返回錯誤給調(diào)用的局部catch,去掉的話會返回給局部then
});
}
// 統(tǒng)一的錯誤報告
function errorHandler(e) {
let errMsg = '請求出錯!'
let onClose = () => {}
let duration = 2000
if (typeof e === 'string') {
errMsg = e
} else if (e.response) {
const { status } = e.response
if (!(200 < status && status < 300 || status === 304)) {
errMsg = '服務器請求超時,請稍后重試';
}
} else if (e.code === 200010005) { // code根據(jù)業(yè)務修改
errMsg = '用戶未登錄';
duration = 800;
onClose = () => {
// 跳轉(zhuǎn)登陸
}
} else {
errMsg = e.msg;
}
// element UI的組件彈框
Message({
type: 'warning',
message: errMsg,
duration: duration,
onClose: onClose
});
}
export const getData = (url = '', params = {}) => {
return ajax('get', url, params)
}
export const postData = (url = '', params = {}) => {
return ajax('post', url, params)
}