import axios from 'axios'; const codeMessage = { 200: '服务器成功返回请求的数据。', 201: '新建或修改数据成功。', 202: '一个请求已经进入后台排队(异步任务)。', 204: '删除数据成功。', 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', 401: '用户没有权限(令牌、用户名、密码错误)。', 403: '用户得到授权,但是访问是被禁止的。', 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', 406: '请求的格式不可得。', 410: '请求的资源被永久删除,且不会再得到的。', 422: '当创建一个对象时,发生一个验证错误。', 500: '服务器发生错误,请检查服务器。', 502: '网关错误。', 503: '服务不可用,服务器暂时过载或维护。', 504: '网关超时。', }; class HttpRequest { constructor(options) { this.options = options; this.queues = {}; } getInsideConfig() { const config = { baseURL: this.options.baseUrl, // baseURL timeout: 10000, responseType: 'json', 'x-requested-with': 'XMLHttpRequest', withCredentials: false, // default headers: { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json', Accept: 'application/json', ...this.options.headers, }, }; return config; } destroy(url) { delete this.queues[url]; } interceptors(instance, url, options) { // 请求拦截 instance.interceptors.request.use( config => { this.queues[url] = true; if (options.beforeRequest instanceof Function) { options.beforeRequest({ queues: this.queues, config, options }); } return config; }, error => Promise.reject(error), ); // 响应拦截 instance.interceptors.response.use( res => { // success this.destroy(url); const { data, status } = res; return { data, status, statusText: codeMessage[status] }; }, error => { // error this.destroy(url); const errorResult = JSON.parse(JSON.stringify(error)); const errorInfo = error.response; if (!errorInfo) { const { request: { status }, } = errorResult; errorResult.statusText = codeMessage[status]; if (options.errorHandler instanceof Function) { options.errorHandler({ queues: this.queues, error, options }); } } return Promise.reject(errorResult); }, ); } request(options) { const instance = axios.create(); const ops = Object.assign(this.getInsideConfig(), options); this.interceptors(instance, ops.url, ops); return instance(ops); } } export default HttpRequest;