zoukankan      html  css  js  c++  java
  • 封装axios统一请求

    1、我们可以在utils文件夹文件新建request文件夹

    import axios from 'axios'
    import Vue from 'vue'
    import ase from './ase'
    // import utils from './utils'
    import store from '../store'
    import { getToken } from '@/utils/auth'
    import Qs from 'qs'
    
    // 定义文件url头部
    // 本地mock
    const url = process.env.ENV_CONFIG === 'dev' ? '/api' : process.env.BASE_API
    
    // 创建axios实例
    const service = axios.create({
      baseURL: url, // api 的 base_url
      timeout: 10000, // 请求超时时间
      transformRequest: [
        function (data) {
          return Qs.stringify(data)
        }
      ]
    })
    /**
      * 提示函数
      * 禁止点击蒙层、显示一秒后关闭
      */
    const tip = res => {
      // Vue.$vux.toast.show({
      //   text: res,
      //   time: 5000,
      //   type: 'warn',
      //   position: 'middle'
      // })
      Vue.$vux.toast.text(res, 'middle')
    }
    
    /**
    * 请求失败后的错误统一处理
    * @param  status 请求失败的状态码
    */
    const errorHandle = (status, other) => {
      // 处理响应数据
      // 400 : 参数格式或者字段名错误
      // 401 : token错误、过期
      // 403: 无权限
      // 500 : 服务错误
      // 状态码判断
      switch (status) {
        case 400:
          tip('请求无效')
          break
        case 404:
          tip('请求的资源不存在')
          break
        case 403:
          tip('无访问权限,请联系管理员!')
          break
        case 500:
          tip('服务端错误,请联系管理员!')
          break
        default:
          console.log(other)
      }
    }
    // console.log('统一的baseURL . ' + process.env.BASE_API)
    // request拦截器
    service.interceptors.request.use(
      config => {
        Vue.$vux.loading.show({ text: '加载中...' })
          if (store.getters.token) {
              config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
           }
        return config
      },
      error => {
        // Do something with request error
        console.log(error) // for debug
        Promise.reject(error)
      }
    )
    
    // response 拦截器
    service.interceptors.response.use(
      response => {
        /**
         * code为非200是抛错 可结合自己业务进行修改
         */
        Vue.$vux.loading.hide()
        // console.log(store.state.isEncrypt, '读取vuex值')
        const isEncrypt = store.state.isEncrypt
        const res = isEncrypt ? ase.DecryptEcb(response.data) : response.data
        if (res.code === 200) {
          return res
        } else {
          // 请求已发出,但是不在2xx的范围
          errorHandle(res.code, res.msg)
          return Promise.reject(res.msg)
        }
      },
      error => {
        Vue.$vux.loading.hide()
        // 处理响应失败
        if (error.message.includes('timeout')) { // 判断请求异常信息中是否含有超时timeout字符串
            tip('网络超时,请联系管理员!')
    return Promise.reject(error) // reject这个错误信息
        }
        return Promise.reject(error)
      }
    )
    
    export default service

    api管理文件引用方法,在需要运用的文件里面例如api.js

    import request from '@/utils/request'
    // 本地模拟mock
    export function sportList (params) {
      return request({
        url: '/index.json',
        method: 'get',
        params
      })
    }

    组件里面引用

    import { sportList } from '@/api/schedule'
    
    method: {
        getSportList() {
          sportList().then(res => {
            this.project = res.data
            this.$nextTick(() => {
              // 比赛日程返回滚动到相应的大项位置
              if (this.$utils.getSession('isScroll')) {
                if(this.$utils.getSession('projectScrollTop')) {
                  this.$refs.content.scrollBy(0, this.$utils.getSession('projectScrollTop'))
                  this.$utils.clearOneSession('isScroll')
                  this.$utils.clearOneSession('projectScrollTop')
                }
              }
            })
          })
        }
    }
  • 相关阅读:
    HTML之元素分类(HTML基础知识)
    GreenPlum 与hadoop什么关系?(转)
    安装配置MySQL
    Linux下安装jdk步骤
    Linux ssh无密码登录
    左右无间切换走马灯angularJS指令
    CSS3制作立方体--有趣的应用
    hello,2017
    渐进增强与优雅降级
    图片上传预览(包含大小压缩)
  • 原文地址:https://www.cnblogs.com/qdlhj/p/11249197.html
Copyright © 2011-2022 走看看