kim-request.js 2.91 KB
Newer Older
duanledexianxianxian's avatar
duanledexianxianxian committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
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 = {
duanledexianxianxian's avatar
duanledexianxianxian committed
29 30 31 32
      baseURL: this.options.baseUrl, // baseURL
      timeout: 10000,
      responseType: 'json',
      withCredentials: false, // default
duanledexianxianxian's avatar
duanledexianxianxian committed
33 34
      headers: {
        'Access-Control-Allow-Origin': '*',
duanledexianxianxian's avatar
duanledexianxianxian committed
35
        'content-type': 'application/json',
duanledexianxianxian's avatar
duanledexianxianxian committed
36
        Accept: 'application/json',
duanledexianxianxian's avatar
duanledexianxianxian committed
37
        'x-requested-with': 'XMLHttpRequest',
duanledexianxianxian's avatar
duanledexianxianxian committed
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
        ...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 => {
duanledexianxianxian's avatar
duanledexianxianxian committed
63
        // success
duanledexianxianxian's avatar
duanledexianxianxian committed
64 65 66 67
        this.destroy(url);
        const { data, status } = res;
        return { data, status, statusText: codeMessage[status] };
      },
duanledexianxianxian's avatar
duanledexianxianxian committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
      error =>
        // console.log('error', error);
        // // error
        // this.destroy(url);
        // const errorResult = JSON.parse(JSON.stringify(error));
        // console.log('errorResult', errorResult);
        // 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 });
        //   }
        // }
duanledexianxianxian's avatar
duanledexianxianxian committed
84

duanledexianxianxian's avatar
duanledexianxianxian committed
85
        Promise.reject(error),
duanledexianxianxian's avatar
duanledexianxianxian committed
86 87 88 89 90 91 92 93 94 95 96
    );
  }

  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;