《程序猿入职必会(7) · 前端请求工具封装》

news2024/12/26 9:23:50

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

  • 写在前面的话
  • 前端请求工具封装
      • 封装思路
      • 实例 Demo
      • 细节说明
  • 总结陈词

CSDN.gif

写在前面的话

前篇博文介绍了,前后端分离实战项目中,关于统一返回结果的封装。
本篇博文就接着介绍一下,前端 Axios 插件封装思路,以及对于这一返回封装结果的接受处理。
加油,程序猿,保持住Tempo,开干,玩的就是真实!

关联文章:
《程序猿入职必会(1) · 搭建拥有数据交互的 SpringBoot 》
《程序猿入职必会(2) · 搭建具备前端展示效果的 Vue》
《程序猿入职必会(3) · SpringBoot 各层功能完善 》
《程序猿入职必会(4) · Vue 完成 CURD 案例 》
《程序猿入职必会(5) · CURD 页面细节规范 》
《程序猿入职必会(6) · 返回结果统一封装》


前端请求工具封装

封装思路

Vue 项目中,可以使用的请求插件很多,这边选用之前已整合完毕的 Axios 展开说明,其他技术类似。
前端请求工具类应该具备哪些特性?

  • 提取所有请求的公用部分,例如后端服务前缀、超时时间、公用请求头等
  • 具备请求前置拦截逻辑,可以针对请求头和参数进行封装,也可以做前端鉴权动作
  • 具备请求后置拦截逻辑,可以针对响应内容进行解析处理,针对不同状态码做出不同应对
  • 对外提供丰富便捷的调用方法,方便页面和组件快速使用

实例 Demo

这里先基于上述的封装思路,展示一段已实现的效果,再拆分说明。

【封装工具类】

/**
 * Http 请求封装工具类
 * Axios是基于http客户端的promise,面向浏览器和NodeJS
 * Created by LinWang on 2020/08/08.
 */
import axios from 'axios'
import qs from 'qs'
import store from '../store'
import { Message, MessageBox } from 'element-ui'
import { getToken } from '@/utils/auth'
import _ from 'lodash'
import { showFullScreenLoading, tryHideFullScreenLoading } from './loadService'

/**
 * 创建Axios实例
 */
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, timeout: process.env.TIME_OUT
})
service.all = axios.all
service.spread = axios.spread

/**
 * 添加一个请求拦截器(前置)
 */
service.interceptors.request.use(config => {
  showFullScreenLoading()
  if (_.isObject(config.data)) {
    config.data = qs.stringify(config.data, { allowDots: true })
  }
  config.headers['Content-Type'] = 'application/x-www-form-urlencoded' // 默认为 application/json
  config.headers.operator = getToken() // 让每个请求携带自定义token,请根据实际情况自行修改
  config.headers.requestId = new Date().getTime() // 请求时间点
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

/**
 * 添加一个返回拦截器(后置处理)
 */
service.interceptors.response.use(response => {
  tryHideFullScreenLoading()
  const res = response.data
  if (response.status !== 200 || !res.success) {
    Message({
      message: res.message, type: 'warning', duration: 5 * 1000
    })
    // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
    if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
      MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
        confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning'
      }).then(() => {
        store.dispatch('FedLogOut').then(() => {
          location.reload() // 为了重新实例化vue-router对象 避免bug
        })
      })
    }
    return Promise.reject(res)
  } else {
    return res.data
  }
}, error => {
  tryHideFullScreenLoading()
  console.log('err' + error)
  Message({
    message: error.error, type: 'warning', duration: 5 * 1000
  })
  return Promise.reject(error)
})

export default service

【框架整合工具类】

Tips:就main.js添加两行代码即可,$http是添加到全局,可以快速使用

import http from '@/utils/request'
Vue.prototype.$http = http

【某个实体对应 api.js - 代码生成】

import request from '@/utils/request'

export default {
  getList(params) {
    return request({
      url: '/zyTeacherInfo/', method: 'get', params
    })
  },

  get(params) {
    return request({
      url: '/zyTeacherInfo/' + params.teaCode, method: 'get', params
    })
  },

  getPage(params) {
    return request({
      url: '/zyTeacherInfo/page', method: 'get', params
    })
  },

  update(params) {
    return request({
      url: '/zyTeacherInfo/update', method: 'post', params
    })
  },

  insert(params) {
    return request({
      url: '/zyTeacherInfo/insert', method: 'post', params
    })
  },

  remove(params) {
    return request({
      url: '/zyTeacherInfo/delete', method: 'post', params
    })
  }
}

【页面使用示例】

// 引入api.js
import ZyTeacherInfoApi from '@/api/study/ZyTeacherInfoApi'

// 通过实体对应api.js,触发删除逻辑
handleDelete(row) {
  let that = this
  ZyTeacherInfoApi.remove({ teaCode: row.teaCode }).then(() => {
    this.$notify({
      title: '成功',
      message: '删除成功',
      type: 'success',
      duration: 1000,
      onClose() {
        that.fetchData()
      }
    })
  })
},

// 利用工具类的all方法,并联查询多个接口
this.$http.all([ZyTeacherInfoApi.getPage(this.listQuery)])
  .then(this.$http.spread(function(perms) {
    that.list = perms.rows
    that.total = perms.total
    that.listLoading = false
  }))

细节说明

【基础 Axios】
整个请求工具类的核心就是 Axios。
使用 axios.create 创建一个 Axios 实例,然后设置后端服务前缀、超时时间等,这些属性都配置再项目配置文件中。
将 axios.all 和 axios.spread,添加到上述实例,方便快速复用。
代码段参考:

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, timeout: process.env.TIME_OUT
})
service.all = axios.all
service.spread = axios.spread

【添加 Axios 请求拦截器】
利用 service.interceptors.request.use 添加请求拦截器,里面按如下步骤执行:

  • 显示全屏 Loading 效果,这个是自己封装的,也可以采用外部插件;
  • 设置 Content-Type,按指定的入参类型组装参数;
  • 设置操作人、时间戳等其他请求头信息;
service.interceptors.request.use(config => {
  showFullScreenLoading()
  if (_.isObject(config.data)) {
    config.data = qs.stringify(config.data, { allowDots: true })
  }
  config.headers['Content-Type'] = 'application/x-www-form-urlencoded' // 默认为 application/json
  config.headers.operator = getToken() // 让每个请求携带自定义token,请根据实际情况自行修改
  config.headers.requestId = new Date().getTime() // 请求时间点
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

【添加 Axios 响应拦截器】
利用 service.interceptors.request.use 添加请求拦截器,里面按如下步骤执行:

  • 响应成功和失败,都需要关闭 Loading 效果;
  • 根据 code 状态码判断失败与否;
  • 如果是成功的话,将数据返回给调用方;
  • 如果是报错的话,返回报错信息给调用发,同时利用提示信息组件,展示提示;
service.interceptors.response.use(response => {
  tryHideFullScreenLoading()
  const res = response.data
  if (response.status !== 200 || !res.success) {
    Message({
      message: res.message, type: 'warning', duration: 5 * 1000
    })
    // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
    if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
      MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
        confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning'
      }).then(() => {
        store.dispatch('FedLogOut').then(() => {
          location.reload() // 为了重新实例化vue-router对象 避免bug
        })
      })
    }
    return Promise.reject(res)
  } else {
    return res.data
  }
}, error => {
  tryHideFullScreenLoading()
  console.log('err' + error)
  Message({
    message: error.error, type: 'warning', duration: 5 * 1000
  })
  return Promise.reject(error)
})

总结陈词

此篇文章介绍了前端 Axios 插件封装思路,仅供学习参考。
Axios 官网用法很多,丰富多彩,但实战中,上述提供的示例已经覆盖了大部分常用用法了。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

足浴行业押金原路退回怎么开通?

一手机版和电脑版差别 手机版押金管理的优点: 1. 便携性:管理人员可以随时随地通过手机查看和处理押金相关事务,不受地点限制。例如,当不在店内时,仍能及时了解押金的收支情况,对突发问题进行处理。 2. 实…

深入解析食堂采购系统源码:打造高效食材供应链APP的核心

本篇文章,笔者将从系统架构、关键模块、技术选型和优化策略等方面,深入解析食堂采购系统的源码,为您揭示打造高效食材供应链APP的核心要点。 一、系统架构 食堂采购系统通常采用分层架构,以保证系统的可维护性和扩展性。主要包括…

糊涂工具包和commons包(Java)

工具包(Commons-io) 介绍: Commons是apache开源基金组织提供的工具包,里面有很多帮助我们提高开发效率的API 比如: StringUtils 字符串工具类 NumberUtils 数字工具类 ArrayUtils 数组工具类 RandomUtils…

记录|C#批量修改文件后缀

文章目录 前言一、.CHK 批量修改成 .mp3更新时间 前言 针对昨天博文:记录|cmd方式恢复U盘中的数据中的文件修复为.CHK格式后,如果将大量的.CHK后缀改为.mp3后缀的问题进行了编写。 主要是,现在网上的批量修改后缀的软件竟然要开会…

基于微信小程序的校园二手交易平台/Java的二手交易网站/基于Javaweb校园二手商品交易系统(附源码)

摘 要 使用校园二手交易平台管理校园二手物品交易,不仅实现了智能化管理,还提高了管理员的管理效率,用户查询的功能也需要校园二手交易平台来提供。 设计校园二手交易平台是毕设的目标,校园二手交易平台是一个不断创新的系统&…

大话成像公众号文章阅读学习(二)--- 下一代 AI-ISP会更好

系列文章目录 文章目录 系列文章目录前言一、AI-ISP1.1 定义与工作原理1.2 应用场景 二、展望总结 前言 这篇是 下一代 AI-ISP会更好 文章地址:https://mp.weixin.qq.com/s/N3YnkXF_stvP6k3jRTKCpQ 一、AI-ISP 1.1 定义与工作原理 定义:AI-ISP&#…

【docker】x host+ 是干嘛用的

先说结论: xhost 首先,xhost是允许外部应用程序连接到主机的X显示器: 其次,-v是挂载目录,用于在容器文件系统中挂载主机的X11显示器,以呈现输出视频。 那么x11显示器具体指的是什么? 在计算机…

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者,其观点始终认为:工业自动化和智能化水平不断提高,人机界面(Human-Machine Interface,简称HMI&a…

铲屎官的必备好物——希喂、352、米家养宠空气净化器分享

对于每一位深爱着家中萌宠的铲屎官而言,无尽的温情往往也伴随着日常生活中的小烦恼。那些不经意间飘散在空气中的毛发,偶尔缠绕在鼻腔或口腔中的细微触感,以及偶尔袭来的不明异味,都是与宠物共度的日子里不可或缺的一部分。幸好随…

2024104读书笔记|《飞花令·田》——独出前门望野田,月明荞麦花如雪,雨中草色绿堪染,水上桃花红欲然

2024104读书笔记|《飞花令田》——独出前门望野田,月明荞麦花如雪,雨中草色绿堪染,水上桃花红欲然 《飞花令田》素心落雪 编著,飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”,类似于行酒令,…

04-Charles中的Map Remote和Map Local介绍

Charles提供了Map Remote和Map Local两个功能。 Map Remote是将指定的网络请求重定向到另一个网址。Map Local是将指定的网络请求重定向到本地文件。 一、Map Remote 假设代码中调用了接口A,但是接口A的响应结果不能满足需求;此时,有另一个…

【传知代码】智慧医疗:纹理特征VS卷积特征(论文复现)

在这个无处不在的技术革新的时代,计算机视觉和机器学习成为了医疗领域中不可或缺的力量。在这篇文章中,我们将探讨两种突出的技术:纹理特征和卷积特征。它们如何在医学影像分析中竞争与协作,为医生提供更深入、更精确的诊断信息&a…

知,已经在行;知行是一件事,不是两件事

97天 知,已经在行;知行是合一并进的,不能把它们分作两件事;学习的开始,就已属于践行了。 真知,即为真行;知行的本体是合一的、并进的,后世学者却把知行一分为二( 近世的…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列,存在的问题:如果第一个消息延时时间很长,而第二个消息延时时间很短,第二个消息并不会优先得到执行。 下载插件 地址:https://github.com/rabbitmq/rabbitmq-delayed-message-excha…

ASP.NET Core 6.0 角色授权 和 策略授权

角色授权 Authorize配置 AuthenticationSchemes配置 在授权时,先要鉴权:找出用户信息,如果能找到用户信息,那就证明用户一定登录过。这里要求不仅需要用户信息,而且还要有符合某些条件的用户信息,这样才能让请求访问资源。可以在某个方法/控制器,标记角色,如果要访问…

网络安全Sirius

关于Sirius Sirius是一款功能强大的通用漏洞扫描工具,该工具可以帮助广大研究人员在大多数场景下识别和验证应用程序中存在的安全漏洞。 现如今,信息安全社区仍然是收集网络安全情报数据最佳且最有利的来源,而且社区本身的表现经常会优于商…

【前端 11】初探DOM

JavaScript 对象 - DOM 初探 在Web开发中,DOM(Document Object Model,文档对象模型)是一个至关重要的概念。它不仅仅是一个API,更是Web页面与JavaScript代码之间的桥梁,允许开发者通过编程的方式动态地访问…

名家笔下的端午

文章目录 [北宋]苏轼《浣溪沙端午》[北宋]欧阳修《渔家傲五月榴花妖艳烘》梁实秋汪曾祺迟子建谈正衡苏童[北宋]苏轼《浣溪沙端午》 轻汗微微透碧纨,明朝端午浴芳兰。流香涨腻满晴川。 彩线轻缠红玉臂,小符斜挂绿云鬟。佳人相见一千年。 苏轼被贬惠州时,唯有王朝云矢志跟随…

influxdb1.8数据备份和恢复、自动备份(记录版)

一、数据备份 这里备份到 home 目录下&#xff0c;windows 和 linux 随意 influxd restore -portable <备份目录路径> influxd restore -portable /home 执行效果图&#xff1a; 二、数据恢复 influxd restore -portable <备份目录> influxd restore -port…

昇思25天学习打卡营第21天|Pix2Pix实现图像转换

相关知识 图像翻译 图像翻译Image translation是一种计算机视觉任务&#xff0c;旨在将一种图像转换为另一种图像。典型的任务包括&#xff1a;图像到图像的转换如白天到黑夜&#xff0c;风格迁移&#xff0c;图像修复。 CGAN CGAN在GAN的基础上引入了条件信息&#xff0c;…