http-request.js 2.99 KB
import { Alert } from 'react-native'
import axios, { CancelToken } from 'axios'
import { APP } from '../config'

class HttpRequest {
  constructor (baseUrl, loginUrl = APP.loginPath) {
    this.baseUrl = baseUrl
    this.loginUrl = loginUrl
    this.header = { ...APP.header }
    this.instance = null
    this.init()
  }
  /**初始化 */
  init() {
    let instance = axios.create({ baseURL: this.baseUrl, headers: this.header })
    this.interceptors(instance)
    this.instance = instance
  }

  /**绑定请求拦截器 */
  interceptors (instance) {
    // 请求
    instance.interceptors.request.use(config => {
      return config
    }, error => {
      if (process.env.NODE_ENV === 'development') console.warn(error)
      return Promise.reject(error)
    })

    // 响应
    instance.interceptors.response.use(res => {

      return this.handleRespone(res)

    }, error => {
      
      if (process.env.NODE_ENV === 'development') console.warn(error)

      return Promise.reject(error.response ? `发生错误,错误代码:${error.response.status};详情:${error.response.message}` : error.message + "")
    })

  }
  
  /**请求 */
  async request (options) {
    return this.instance(options)
  }

  /**
   * 可取消的请求,返回一个source对象对象。可通过 source.cancel(msg) 取消此请求
   * @param {*} options 
   * @param {function} successCallback 
   * @param {function} errorCallback 
   */
  sourceRequest(options, successCallback, errorCallback) {
    const source = CancelToken.source()
    options = Object.assign(options, {  cancelToken: source.token })
    this.instance(options)
        .then(successCallback)
        .catch(errorCallback)
    return source
  }


  /**
   * 设置请求头
   * @param {string} key 
   * @param {any} value 
   */
  setHeader(key, value) {
    this.instance.defaults.headers.common[key] = value
  }
  
  /**
   * 设置URL
   * @param {string} url 
   */
  setBaseUrl(url) {
    this.instance.defaults.baseURL = url
  }

  /**
   * 处理响用体
   * @param {response} res 
   */
  handleRespone(res) {
    const { code, message, data } = res.data
    switch(code) {
      case 200:
        if (res.config.url === this.loginUrl) this.saveLoginInfo(data.jwt, data.user.vid, res.config.data) //保存登陆数据
        return data
      case 401:
        Alert.alert('登陆状态失效,请重新登陆')
      break
      case 403:
        return Promise.reject(`发生错误,错误代码: ${code};详情:无权限使用此功能`)
      default: 
        if (process.env.NODE_ENV === 'development') console.warn(JSON.stringify(res))
        return Promise.reject(`发生错误,错误代码: ${code};详情:${message}`)
    }
  }
  
  /**
   * 保存登陆数据
   * @param {*} jwt token
   * @param {*} data 请求数据体
   */
  saveLoginInfo(jwt, vid, data) {
    data = JSON.parse(data)
    const { applyCarrier, applyPlatform } = data
    // store.commit('SYSTEM_LOGIN', { jwt , vid, applyCarrier, applyPlatform})
  }
}

export default HttpRequest