axios封装

作者: 丿Sorry丶 | 来源:发表于2020-06-08 06:55 被阅读0次

    1、封装axios

    import axios from 'axios';
    import { baseUrl } from '../config/env'
    import { getToken } from '@/utils/auth'
    // axios 配置
    axios.defaults.timeout = 5000
    axios.defaults.baseURL = baseUrl
    
    // http request 拦截器
    axios.interceptors.request.use(
      config => {
        if (getToken()) {
          config.headers['token'] = getToken()
        }
        return config
      },
      err => {
        return Promise.reject(err)
      })
    
    // http response 拦截器
    axios.interceptors.response.use(
      response => {
        return response
      },
      error => {
        return Promise.resolve(error.response)
      })
    
    export default axios
    

    2、对请求做封装,具体怎么来封装,根据自己的接口来

    import Vue from 'vue'
    import axios from './request'
    import qs from 'qs'
    import { removeToken } from '@/utils/auth'
    export default async (url = '',
     type = 'POST') => {
      type = type.toLowerCase()
      return new Promise((resolve, reject) => {
        var request = null
        const CancelToken = axios.CancelToken
        if (type === 'form') {
          let transform = qs.stringify(data);
          request = axios({
            method: 'post',
            url: url,
            data: transform,
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded'
            }
          }, {
            cancelToken: new CancelToken(function executor (c) {
              Vue.$httpRequestList.push(c)
            })
          })
        } else if (type === 'down') {
          request = axios({
            method: 'post',
            url: url,
            data: data,
            responseType: 'blob',
            headers: {
              'Content-Type': 'application/octet-stream'
            }
          }, {
            cancelToken: new CancelToken(function executor (c) {
              Vue.$httpRequestList.push(c)
            })
          })
        } else {
          if (data instanceof Object) {
            if (type === 'post') {
              request = axios({
                method: type,
                url: url,
                params: data
              }, {
                cancelToken: new CancelToken(function executor (c) {
                  Vue.$httpRequestList.push(c)
                })
              })
            } else {
              request = axios({
                method: type,
                url: url,
                params: data,
                cancelToken: new CancelToken(function executor (c) {
                  Vue.$httpRequestList.push(c)
                })
              })
            }
          } else {
            if (type === 'post') {
              request = axios({
                method: type,
                url: data ? `${url}/${data}` : url,
              }, {
                cancelToken: new CancelToken(function executor (c) {
                  Vue.$httpRequestList.push(c)
                })
              })
            } else {
              request = axios({
                method: type,
                url: data ? `${url}/${data}` : url,
                cancelToken: new CancelToken(function executor (c) {
                  Vue.$httpRequestList.push(c)
                })
              })
            }
          }
        }
        request.then(response => {
          if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {
            if (response.data.code === 301) {
              if (Vue.$httpRequestList.length > 0) {
                Vue.$httpRequestList.forEach((item) => {
                  item()
                })
                Vue.$httpRequestList = []
              }
              removeToken()
            } else if (response.data.code === 200) {
              resolve(response.data)
            } else {
              
            }
          } 
        }, err => {
          reject(err)
        }).catch((error) => {
          reject(error)
        })
      })
    }
    

    3、接口

    import fetch from '../utils/fetch' //将第二步的文件引入
    // 登录
    const login = data => fetch('/login', data, 'form')
    export default {
      login
    }
    

    4、调用

    import loginService from '@/api/loginService'
    async login(data) {
          const res = await loginService.login(data);
          if (res.code == 200) {
            // do.....
          }
        }
    

    相关文章

      网友评论

        本文标题:axios封装

        本文链接:https://www.haomeiwen.com/subject/wtogzhtx.html