kim-request.js 2.77 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 29 30 31 32 33 34 35 36 37 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
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,
      headers: {
        'x-requested-with': 'XMLHttpRequest',
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json',
        Accept: 'application/json',
        withCredentials: false, // default
        timeout: 10000,
        responseType: '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 => {
        this.destroy(url);
        const { data, status } = res;
        return { data, status, statusText: codeMessage[status] };
      },
      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;