Commit 8f18a84e authored by 郝聪敏's avatar 郝聪敏

修改http

parent 6c89e437
Pipeline #558 failed with stages
...@@ -24,6 +24,7 @@ import {http} from './sys-sdk' ...@@ -24,6 +24,7 @@ import {http} from './sys-sdk'
Object.assign(http._extend, { Object.assign(http._extend, {
loginUrl: `${config}/user/toLogin`, // token过期后的登录地址 loginUrl: `${config}/user/toLogin`, // token过期后的登录地址
notice: iView.Notice // 发生错误时提示信息的组件 notice: iView.Notice // 发生错误时提示信息的组件
refresTokenHost: `http://backstms.q-gp.com` // 刷新tokenhost
}) })
// xxx.service.js // xxx.service.js
......
'use strict' import axios from 'axios';
import localStorage from './localStorage';
import Bus from './bus';
import axios from 'axios' let CancelToken = axios.CancelToken; // axios中断取消请求
let httpQueue = []; // 请求队列
import localStorage from './localStorage' let cancelArr = []; // 存储取消方法
import Cookies from './cookie' let timeout = 200; // 延时loading
let loadingTimeOut;
let closeTimeOut;
const config = { const config = {
timeout: 5000 timeout: 5000,
} };
const instance = axios.create(Object.assign({}, config)) const instance = axios.create(Object.assign({}, config));
// 挂载扩展配置 // 挂载扩展配置
instance._extend = {} instance._extend = {
notice: '',
loginUrl: '',
refresTokenHost: '',
};
let isRefreshing = true;
let subscriber = [];
const addSubscriber = callback => subscriber.push(callback);
const wait = async seconds => new Promise(resolve => setTimeout(resolve, seconds));
const onAccessTokenFetched = () => {
subscriber.forEach(callback => callback());
subscriber = [];
};
const requestInterceptor = function (config) { const refreshtoken = async () => {
if (localStorage.get('token')) { return instance.get(`${instance._extend.refresTokenHost}/oauth/refreshtoken?refreshtoken=${localStorage.get('refreshToken')}`);
config.headers['x-auth-token'] = localStorage.get('token') || '' };
/*
* 刷新token逻辑
*/
const refreshRequest = async options => {
const promise = new Promise(resolve => addSubscriber(() => resolve(instance.request(options))));
if (isRefreshing) {
isRefreshing = false;
await wait(500);
const data = await refreshtoken();
localStorage.set('token', data.accessToken);
onAccessTokenFetched();
isRefreshing = true;
}
return promise;
};
function beforeRequest(model) {
if (!model) model = 'common';
httpQueue.push(model);
loadingTimeOut = setTimeout(() => {
if (httpQueue.length !== 0) {
Bus.$emit(`${model}ShowLoading`);
}
}, timeout);
closeTimeOut = setTimeout(() => {
Bus.$emit(`${model}HideLoading`);
}, 30 * 60 * 1000);
}
function afterRequest(model) {
if (!model) model = 'common';
clearTimeout(loadingTimeOut);
var index = httpQueue.indexOf(model);
if (index > -1) {
httpQueue.splice(index, 1);
}
if (httpQueue.indexOf(model) === -1) {
clearTimeout(closeTimeOut);
setTimeout(() => {
Bus.$emit(`${model}HideLoading`);
}, 100);
}
}
function clearRequest() {
let modelArr = Array.from(new Set(httpQueue));
for (let i = 0; i < modelArr.length; i++) {
Bus.$emit(`${modelArr[i]}HideLoading`);
} }
config.headers['x-auth-system'] = Cookies.get('op.system') || '' httpQueue = [];
config.headers['X-Requested-With'] = 'XMLHttpRequest'
return config
} }
// http request 拦截器
instance.interceptors.request.use(
config => {
beforeRequest(config.headers._loading);
const token = localStorage.get('token');
if (token) {
config.headers['X-Auth-Token'] = token;
config.headers['Access-Token'] = token;
config.headers['X-Requested-With'] = 'XMLHttpRequest';
}
let rewriteMap = {};
const responseInterceptor = function (response) { let isUrl = /^(http:\/\/|https:\/\/)/;
if (response.status < 200 || response.status > 300 || response.data.code !== '0000') { if (isUrl.test(config.url)) {
instance._extend.notice && instance._extend.notice.error({ let arr = config.url.split('/');
desc: response.data && response.data.msg || '后端服务异常' let path = (arr && arr[3]) || '';
}) if (rewriteMap[path]) {
let hasQuery = config.url.indexOf('?') !== -1;
config.url += !hasQuery ? '?' : '&';
}
}
return Promise.reject(response) // todo: 某些接口不支持operator参数的话,需要排除
if (config.method === 'post' || config.method === 'get') {
if (typeof config.data === 'object') {
} else if (typeof config.data === 'string' && config.method === 'post') {
} else if (config.method === 'get') {
// //普通的get请求
if (config.url.indexOf('offline_record') !== -1) {
config.data = true;
config.headers.common['content-type'] = 'application/x-www-form-urlencoded';
}
}
}
return config;
},
error => {
return Promise.reject(error);
} }
);
return response.data instance.interceptors.response.use(
} response => {
afterRequest(response.config.headers._loading);
if (response.headers['content-type'] === 'application/octet-stream' || (response.headers['content-type'] === 'application/vnd.ms-excel;charset=UTF-8' && response.data.byteLength !== 'undefied')) {
return response.data;
}
if (response.config.responseType === 'arraybuffer') {
return response.data;
}
/** // http error
* 不使用默认拦截器 // 200 - 300 之间的都是正常响应
* axios.interceptors.request.eject(0) if (response.status > 200 || response.status < 300) {
* axios.interceptors.response.eject(0) const codeArr = [0, '0', 2000];
*/ if (response.data && ((response.data.code === '0000' && response.data.businessCode === '0000') || codeArr.includes(response.data.code))) {
instance.interceptors.request.use(requestInterceptor, (error) => { return response.data.data || response.data;
return Promise.reject(error) }
}) if (response.data.code === 4033) {
// token过期;
instance.interceptors.response.use(responseInterceptor, error => { return refreshRequest(response.config);
if (error.response) { }
switch (error.response.status && instance._extend.loginUrl) { if (response.data.code === 4010 || response.data.code === 4011) {
case 401: var href = window.location.href;
let href = window.location.href.replace(/\?token=[a-z0-9\-A-Z]+/g, '') href = href.replace(/\?token=[a-z0-9\-A-Z]+/g, '');
window.location.href = instance._extend.loginUrl + '?url=' + window.btoa(href) window.location.href = instance._extend.loginUrl + '?url=' + window.btoa(href);
break return;
}
instance._extend.notice.error({
desc: (response && response.data && response.data.msg) || '后端服务异常',
// desc: ''
});
return Promise.reject(response && response.data);
} }
// eg: file response does not have data
instance._extend.notice.error({
desc: (response && response.data && (response.data.detail || response.data.msg)) || '后端服务异常',
});
return Promise.reject(response.data);
},
error => {
instance._extend.notice.error({
title: '后端服务异常',
});
if (axios.isCancel(error) || error.message.indexOf('Network') > -1) {
clearRequest();
} else {
afterRequest(error.response && error.response.config.headers._loading);
if (error.response) {
switch (error.response.status) {
case 401:
// todo: 系统中有3处处理401的地方
var href = window.location.href;
href = href.replace(/\?token=[a-z0-9\-A-Z]+/g, '');
window.location.href = instance._extend.loginUrl + '?url=' + window.btoa(href);
return;
}
}
}
return Promise.reject(error);
} }
return Promise.reject(error) );
})
const http = {
_extend(options) {
Object.assign(instance._extend, options);
},
get(url, options) {
return new Promise((resolve, reject) => {
instance
.get(
url,
Object.assign({}, options, {
cancelToken: new CancelToken(c => {
cancelArr.push(c);
}),
})
)
.then(res => {
resolve(res);
})
.catch(e => {
if (!axios.isCancel(e)) {
reject(e);
}
});
});
},
post(url, data, options) {
return new Promise((resolve, reject) => {
instance
.post(
url,
data,
Object.assign({}, options, {
cancelToken: new CancelToken(c => {
cancelArr.push(c);
}),
})
)
.then(res => {
resolve(res);
})
.catch(e => {
reject(e);
});
});
},
put(url, data, options) {
return new Promise((resolve, reject) => {
instance
.put(
url,
data,
Object.assign({}, options, {
cancelToken: new CancelToken(c => {
cancelArr.push(c);
}),
})
)
.then(res => {
resolve(res);
})
.catch(e => {
if (!axios.isCancel(e)) {
reject(e);
}
});
});
},
delete(url, options) {
return new Promise((resolve, reject) => {
instance
.delete(
url,
Object.assign({}, options, {
cancelToken: new CancelToken(c => {
cancelArr.push(c);
}),
})
)
.then(res => {
resolve(res);
})
.catch(e => {
if (!axios.isCancel(e)) {
reject(e);
}
});
});
},
cancel() {
cancelArr.map(cancel => cancel());
},
};
export default instance export default http;
{ {
"name": "sys-sdk", "name": "@qg/sys-sdk",
"version": "1.0.1", "version": "1.0.6",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment