Skip to content
javascript
import axios from 'axios'
import qs from 'querystring'

class Request {
  constructor () {
    this.defaults = {
      baseURL: import.meta.env.VITE_API_BASE_URL,
      timeout: 10000,
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      transformRequest (data, headers) {
        return headers['Content-Type'] === 'application/x-www-form-urlencoded'
          ? qs.stringify(data)
          : data
      }
    }
  }

  request(url, options = {}) {
    const instance = axios.create()
    const config = { ...this.defaults, ...{ url, ...options } }
    this.setInterceptor(instance)
    return instance(config)
  }

  setInterceptor(instance) {
    instance.interceptors.request.use(config => {
      const token = localStorage.getItem('token')

      if (token) {
        config.headers.Authorization = token
      }

      return config
    }, error => {
      return Promise.reject(error)
    })

    instance.interceptors.response.use(response => {
      return response.data
    }, error => {
      const { response } = error

      if (response) {
        switch (response.status) {
          case 401:
            location.hash = '#/login'
            return []
          case 403:
            location.hash = '#/login'
            return []
          case 404:
            break;
        }
      } else {
        // 服务器连结果都没返回 1.服务器崩溃 2.用户断网
        if (!window.navigator.onLine) {
          // 断网处理: 可以跳转到断网界面
          return
        }
        // 服务器奔溃
        return Promise.reject(error)
      }
    })
  }
}

export default new Request()