axios的基本封装

144 阅读1分钟

开箱即用的简易封装axios

import axios from 'axios'

import { BASE_URL } from '@/assets/url/urls'

let services
let newServices
let serviceInit
<!--混入所有接口都需要的公共参数-->
let publicParams = {}


function httpService (service, contentType) {
  service.interceptors.request.use(
    request => {
      if (request.method === 'get') {
        request.params = {
          ...publicParams,
          ...request.params,
          <!--ie兼容处理-->
          t: Date.now()
        }
      }
      if (request.method === 'post' && contentType !== 'multipart/form-data;charset=UTF-8') {
        request.data = {
          ...publicParams,
          ...request.data
        }
      }
      return request
    },
    error => {
      console.error('Request Error: ' + error)
      return Promise.reject(error)
    }
  )
    // 返回拦截器 公共处理,根据后端返回的状态码处理
  service.interceptors.response.use(
    response => {
      let body = response.data
      if (body.code && body.code !== '200') {
        console.error(body.msg)
      }
      /*
       2xx
       * */
      if (body.code === '2xx') {
        if (process.env.NODE_ENV === 'development') {
          alert('登录失效')
        } else {
          // 跳转到某个路径 或手动跳转到登录页面
          window.location.href = body.data
        }
      }
      return body
    },
    error => {
      console.error('Response Error: ' + error)
      return Promise.reject(error)
    }
  )
}

function createService (axiosConfig = {}, baseUrl = BASE_URL, headers = {}) {
  if (process.env.NODE_ENV === 'development') {
    let paramsInStorage = localStorage.getItem('accountParams')
    if (paramsInStorage) {
      publicParams = JSON.parse(paramsInStorage)
    }
  }
  let params = {
    baseURL: baseUrl,
    timeout: 60000,
    // 根据实际需求,在headers中混入项目差异化的东西
    headers: {
      'X-Requested-With': 'XMLHttpRequest',
      ...publicParams,
      ...headers
    },
    ...axiosConfig
  }
  // 测试环境默认超级账号配置
  window.location.hostname === 'localhost' &&
  (params.headers.someMessage = publicParams.someAccount || '')
  const service = axios.create(params)
  // 对service做拦截过滤处理
  httpService(service, headers['Content-Type'])
  return service
}
// 初始化时新增公共参数
function initPublicParams (params = {}) {
  if (process.env.NODE_ENV === 'development') {
    let paramsInStorage = localStorage.getItem('accountParams')
    if (paramsInStorage) {
      params = JSON.parse(paramsInStorage)
    }
  }
  publicParams = params
  services = createService()
  <!--差异化处理部分后台需求-->
  newServices = createService({}, '/aaa/bbb')
}

serviceInit = createService()

export {
  serviceInit,
  services,
  newServices,
  initPublicParams
}