当前位置: 首页 > news >正文

项目实战-Api的解决方案

问题

  • vue-cli3 下环境变量切换问题
    调用远程api时候,希望本地开发使用内网IP地址(开发人员本地版本),部署后使用部署版本
  • 封装 axios
  • api 管理

解决方案

  • 环境变量切换
    vue-cli3 中,环境变量是通过 '.env.XXX' 的隐藏文件来配置的,可在 环境变量和模式 中找到解决方案。
    所以就直接项目情况,建立了两个文件:

    • .env

      # 所有环境
      # 网络请求公用地址
      VUE_APP_API=
    • .env.development

      # 开发环境
      # 网络请求公用地址
      VUE_APP_API=http://api.youproject.com/
  • 封装 axios
    对axios进行封装,包括基础设置,错误处理,跨域请求的基础设置

    // @/plugin/axios
    import axios from 'axios'
    import router from '@/router'
    import { Toast } from 'vant'
    
    // 创建一个 axios 实例
    const service = axios.create({
      baseURL: process.env.VUE_APP_API,
      timeout: process.env.NODE_ENV === 'development' ? 120000 : 30000 // 请求超时时间 30s
    })
    
    service.defaults.headers.get['Content-Type'] = 'application/json'
    service.defaults.headers.put['Content-Type'] = 'application/json'
    service.defaults.headers.post['Content-Type'] = 'application/json'
    service.defaults.headers.delete['Content-Type'] = 'application/json'
    
    // 响应拦截器
    service.interceptors.response.use(
      function (response) {
        /* 
          返回的数据约定
          {
            code: 0, // 99 token 无效
            message: "",
            success: true,
            data: {} // 返回的数据
          }
        */
        // dataAxios 是 axios 返回数据中的 data
        const dataAxios = response.data
        // 这个状态码是和后端约定的
        const { code, success, message } = dataAxios
        // 根据 code 进行判断
        if (code === undefined) {
          // 直接返回数据的情况
          return dataAxios
        } else if (!code) {
          if (success) {
            if (dataAxios.data === null || dataAxios.data === undefined) {
              return true
            } else {
              return dataAxios.data
            }
          } else {
            Toast.fail(message)
            return null
          }
        } else {
          // 有 code 代表这是一个后端接口 可以进行进一步的判断
          switch (code) {
            case 0:
            case 200:
              // [ 示例 ] code === 0/200 代表没有错误
              return dataAxios.data
            case 99:
              Toast.fail('token无效,请重新登录')
              router.replace({
                name: 'Unauthorized'
              })
              break
            default:
              Toast.fail(`${dataAxios.code} - ${dataAxios.message}`)
          }
        }
      },
      function (error) {
        if (error && error.response) {
          switch (error.response.status) {
            case 400: error.message = '请求错误' break
            case 401: error.message = '授权错误,请登录' break
            case 403: error.message = '拒绝访问' break 
            case 404: error.message = `请求地址出错: ${error.response.config.url}` break 
            case 408: error.message = '请求超时' break 
            case 422: error.message = '验证出错' break 
            case 500: error.message = '服务器内部错误' break 
            case 501: error.message = '服务未实现' break 
            case 502: error.message = '网关错误' break 
            case 503: error.message = '服务不可用' break 
            case 504: error.message = '网关超时' break 
            case 505: error.message = 'HTTP版本不受支持' break
          }
        }
        Toast.clear()
        Toast.fail(error.message)
        return Promise.reject(error)
      }
    )
    
    export default service
  • api 管理
    在实际项目中,我期望的是api能放在一个统一的地方进行管理,这样在有大变化的时候不用多个文件去查找修改,在编码的时候也方便很多,代码也会清晰点,实现如下

    // src/api/index.js
    import common from './common'
    // ...
    export default {
      common,
      // ...
    }
    
    // src/api/common.js
    import axios from '@/plugin/axios'
    
    export default {
      getCurrentUserInfo () {
        return axios.get('/api/common/getCurrentUserInfo.json')
      },
    }

    如何使用呢:

    // src/main.js
    import Vue from 'vue'
    import api from './api'
    
    Vue.prototype.$api = api
    
    // src/views/business.vue
    // ...
    this.$api.common.getCurrentUserInfo().then(res => {
      // ...
    })
    // ...

相关文章:

  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • 五个举措:现代化Jenkins 和终结“Jenkinsteins”
  • Vue官网教程学习过程中值得记录的一些事情
  • sass安装
  • LGPL与闭源程序
  • 聊聊flink的checkpoint配置
  • 堆的python实现及其应用
  • 创建一种深思熟虑的文化
  • 亚马逊Alexa借助神经网络生成播音员声音
  • 将VCSA 6.5添加到AD域
  • nginx 4层tcp代理获取真实ip
  • 刘鹏教授在新闻出版大数据应用管理技术专题培训班上作报告!
  • Mybatis配置返回为修改影响条数
  • spring源码-aop源码-5.1
  • 洛谷P2805 植物大战僵尸
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Effective Java 笔记(一)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JavaScript HTML DOM
  • MaxCompute访问TableStore(OTS) 数据
  • Odoo domain写法及运用
  • PHP面试之三:MySQL数据库
  • Vue学习第二天
  • Xmanager 远程桌面 CentOS 7
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 多线程事务回滚
  • - 概述 - 《设计模式(极简c++版)》
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 马上搞懂 GeoJSON
  • 使用Swoole加速Laravel(正式环境中)
  • 一个JAVA程序员成长之路分享
  • 用Canvas画一棵二叉树
  • postgresql行列转换函数
  • 阿里云服务器购买完整流程
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​2020 年大前端技术趋势解读
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (c语言)strcpy函数用法
  • (NSDate) 时间 (time )比较
  • (SpringBoot)第二章:Spring创建和使用
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (六)软件测试分工
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转) Android中ViewStub组件使用
  • (转载)利用webkit抓取动态网页和链接
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes