如何用封装自己的Axios

如何封装

首先创建一个http.js的文件

import axios from 'axios'
import store from '@/store'
import { router } from '@/router'
import i18n from '../lang'
import { Message, Loading } from 'element-ui'

// 创建 axios 实例
const service = axios.create({})
// 设置默认
service.defaults.headers = {
  'X-Requested-With': 'XMLHttpRequest'
}
service.defaults.timeout = 10000
// service.defaults.baseURL = process.env.BASE_API

//用来处理刷新token后重新请求的自定义变量
service.defaults.isRetryRequest = false

// loadinginstace 遮罩层控制
let loadingInstance
// pending 存放正在请求的ajax
const pending = {}
const CancelToken = axios.CancelToken

const removePending = (key, isRequest = false) => {
  if (pending[key] && isRequest) {
    pending[key](i18n.t('msg.ajaxRepetitionCancel'))
  }
  delete pending[key]
}

const getRequestIdentify = (config, isReuest = false) => {
  let url = config.url
  if (isReuest) {
    url = config.baseURL + config.url.substring(1, config.url.length)
  }
  return config.method === 'get' ? encodeURIComponent(url + JSON.stringify(config.params)) : encodeURIComponent(config.url + JSON.stringify(config.data))
}

// POST传参序列化(添加请求拦截器)
// 在发送请求之前做某件事
service.interceptors.request.use(config => {
  // 拦截重复请求(即当前正在进行的相同请求)
  let requestData = getRequestIdentify(config, true)
  removePending(requestData, true)
  config.cancelToken = new CancelToken((c) => {
    pending[requestData] = c
  })
  // // 设置以 form 表单的形式提交参数
  // if(config.method  === 'post'){
  //   // JSON 转换为 FormData
  //   const formData = new FormData()
  //   Object.keys(config.data).forEach(key => formData.append(key, config.data[key]))
  //   config.data = formData
  // }
  // 验证添加token
  if (store.getters.token) {
    config.headers.Authorization = 'Bearer ' + store.getters.token
  }
  return config
}, error => {
  alert(i18n.t('msg.ajaxParamsError'), 'fail')
  return Promise.reject(error)
})

// request拦截器,实现loading加载
// service.interceptors.request.use(config => {
//   loadingInstance = Loading.service({})
//   return config
// }, error => {
//   loadingInstance.close()
//   Message({
//     message: error.message,
//     type: 'error',
//     duration: 5 * 1000
//   })
//   return Promise.reject(error)
// })

// // response拦截器,实现loading关闭
// service.interceptors.response.use(data => {
//   loadingInstance.close()
//   return data
// }, error => {
//   Message({
//     message: error.message,
//     type: 'error',
//     duration: 5 * 1000
//   })
//   return Promise.reject(error)
// })

// 响应拦截器即异常处理
service.interceptors.response.use(response => {
  // 把已经完成的请求从 pending 中移除
  let requestData = getRequestIdentify(response.config)
  removePending(requestData)
  return response
}, err => {
  if (err && err.response) {
    switch (err.response.status) {
      case 400:
        err.message =  i18n.t('msg.ajax400Msg')
        break;
      case 401:
        err.message = i18n.t('msg.ajax401Msg')
        store.dispatch('DelToken');
        location.reload()
        break;
      case 403:
        err.message = err.response.data.message
        store.dispatch('DelToken');
        location.reload()
        break;
      case 404:
        err.message = i18n.t('msg.ajax404Msg')
        break;
      case 405:
        err.message = i18n.t('msg.ajax405Msg')
        break;
      case 408:
        err.message = i18n.t('msg.ajax408Msg')
        break;
      case 500:
        err.message = i18n.t('msg.ajax500Msg')
        break;
      case 501:
        err.message = i18n.t('msg.ajax501Msg')
        break;
      case 502:
        err.message = i18n.t('msg.ajax502Msg')
        break;
      case 503:
        err.message = i18n.t('msg.ajax503Msg')
        break;
      case 504:
        err.message = i18n.t('msg.ajax504Msg')
        break;
      case 505:
        err.message = i18n.t('msg.ajax505Msg')
        break;
      default:
        err.message = i18n.t('msg.ajaxDefaultMsg') + `${err.response.status}`
    }
  } else {
    if(err.message && err.message !== i18n.t('msg.ajaxRepetitionCancel')){
      err.message = i18n.t('msg.ajaxDefaultMsg2')
    }
  }
  //Message.error({message: err.message})
  return Promise.reject(err)
})

export default service

然后再创建你想要存放接口的文件 如 home.js

//引入
import Axios from '@/utils/http'

// 热点分类信息接口
export function gethotpot (data) {
  return Axios({
    url: '/rsds/gethotpot',
    method: 'post',
    data,
    timeout:20000  //超时时间也可设置
  })
}

// 认证数量接口
export function getsummary (data) {
  return Axios({
    url: '/rsds/getsummary',
    method: 'post',
    data
  })
}

如何在vue文件中使用
import { getsummary, gethotpot } from ‘@/api/home’

然后在methods里调用

get_Summary() {
 getsummary().then(response => {
   console.log(response)
 })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值