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

基于 Axios 的 HTTP 请求封装文件解析

import axios from "axios";
import { ElMessage } from "element-plus";
import store from "@/store";
import router from "@/router";// 创建axios实例
const service = axios.create({baseURL: "http://localhost:8080/api", // 后端地址timeout: 5000,
});// 请求拦截器
service.interceptors.request.use((config) => {// 如果有token,添加到请求头if (store.getters.token) {config.headers["Authorization"] = "Bearer " + store.getters.token;}return config;},(error) => {console.log(error);return Promise.reject(error);}
);// 响应拦截器
service.interceptors.response.use((response) => {// 如果是blob类型的响应(文件下载),直接返回if (response.config.responseType === 'blob') {return response.data;}// 如果响应的Content-Type是text/csv,也直接返回const contentType = response.headers['content-type'];if (contentType && contentType.includes('text/csv')) {return response.data;}const res = response.data;// 如果code不是200,说明出错了if (res.code !== 200) {ElMessage({message: res.message || "请求失败",type: "error",duration: 5 * 1000,});// 401: 未登录if (res.code === 401) {store.dispatch("user/logout");router.push("/login");}return Promise.reject(new Error(res.message || "请求失败"));} else {return res;}},(error) => {console.log("err" + error);ElMessage({message: error.message,type: "error",duration: 5 * 1000,});return Promise.reject(error);}
);export default service;

基于 Axios 的 HTTP 请求封装文件,提供了完整的请求/响应拦截、错误处理和认证机制。

1. 依赖导入

import axios from "axios";
import { ElMessage } from "element-plus";
import store from "@/store";
import router from "@/router";
  • axios:HTTP 请求库
  • ElMessage:ElementPlus 的消息提示组件
  • store:Vuex 状态管理器,用于获取用户 token
  • router:Vue Router,用于页面跳转(如登录失效时跳转到登录页)

2. 创建 Axios 实例

const service = axios.create({baseURL: "http://localhost:8080/api", // 后端地址timeout: 5000,
});
  • baseURL:设置基础 URL,所有请求都会以此为前缀
  • timeout:请求超时时间 5 秒,避免请求长时间挂起

3. 请求拦截器

service.interceptors.request.use((config) => {// 如果有token,添加到请求头if (store.getters.token) {config.headers["Authorization"] = "Bearer " + store.getters.token;}return config;},(error) => {console.log(error);return Promise.reject(error);}
);

功能说明:

  • 自动添加认证头:检查 store 中是否有 token,如果有则自动添加到请求头
  • Bearer Token 格式:使用标准的 JWT Token 认证格式
  • 错误处理:捕获请求配置阶段的错误

4. 响应拦截器

这是代码的核心部分,处理各种响应情况:

4.1 特殊响应类型处理

// 如果是blob类型的响应(文件下载),直接返回
if (response.config.responseType === 'blob') {return response.data;
}// 如果响应的Content-Type是text/csv,也直接返回
const contentType = response.headers['content-type'];
if (contentType && contentType.includes('text/csv')) {return response.data;
}
  • 文件下载处理:对于 blob 类型响应(通常是文件下载),直接返回数据
  • CSV 文件处理:对于 CSV 格式的响应,也直接返回原始数据
  • 避免数据结构解析:这些特殊类型不需要按照标准 API 响应格式处理

4.2 标准 API 响应处理

const res = response.data;
// 如果code不是200,说明出错了
if (res.code !== 200) {ElMessage({message: res.message || "请求失败",type: "error",duration: 5 * 1000,});// 401: 未登录if (res.code === 401) {store.dispatch("user/logout");router.push("/login");}return Promise.reject(new Error(res.message || "请求失败"));
} else {return res;
}

处理逻辑:

  1. 统一响应格式:假设后端返回格式为 { code: number, message: string, data: any }
  2. 错误状态处理:code 不为 200 时视为错误
  3. 用户提示:使用 ElMessage 显示错误信息
  4. 认证失效处理
    • 401 状态码表示未登录或 token 过期
    • 自动执行登出操作(清除 store 中的用户信息)
    • 跳转到登录页面
  5. 错误传播:返回 rejected Promise,便于上层捕获处理

4.3 网络错误处理

(error) => {console.log("err" + error);ElMessage({message: error.message,type: "error",duration: 5 * 1000,});return Promise.reject(error);
}
  • 网络异常:处理网络连接失败、超时等错误
  • 用户反馈:显示错误消息给用户
  • 错误日志:在控制台记录错误信息

5. 设计模式和最佳实践

5.1 拦截器模式

  • 请求拦截:统一添加认证信息
  • 响应拦截:统一处理错误和特殊情况

5.2 错误处理策略

  • 分层错误处理:网络错误、业务错误分别处理
  • 用户友好:所有错误都有用户提示
  • 自动化处理:认证失效自动跳转登录

5.3 代码复用

  • 全局配置:一次配置,整个项目复用
  • 统一格式:所有 HTTP 请求使用相同的处理逻辑

6. 使用示例

// 在组件中使用
import request from '@/utils/request'// GET 请求
request.get('/users')// POST 请求
request.post('/users', { name: 'John' })// 文件下载
request.get('/export/csv', { responseType: 'blob' })
http://www.xdnf.cn/news/17591.html

相关文章:

  • Console Variables Editor插件使用
  • 音视频学习(五十三):音频重采样
  • QT QProcess + xcopy 实现文件拷贝
  • Web安全自动化测试实战指南:Python与Selenium在验证码处理中的应用
  • Mybatis @Param参数传递说明
  • 【工作笔记】Wrappers.lambdaQuery()用法
  • RK3588在YOLO12(seg/pose/obb)推理任务中的加速方法
  • JS数组排序算法
  • 打靶日常-upload-labs(21关)
  • 【密码学】8. 密码协议
  • Android 开发问题:Invalid id; ID definitions must be of the form @+id/ name
  • 【系统分析师】软件需求工程——第11章学习笔记(上)
  • A#语言详解
  • GitHub上为什么采用Gradle编译要多于Maven
  • 【走进Docker的世界】深入理解Docker网络:从模式选择到实战配置
  • AI质检数据准备利器:基于Qt/QML 5.14的图像批量裁剪工具开发实战
  • 【代码随想录day 15】 力扣 404. 左叶子之和
  • nginx+Lua环境集成、nginx+Lua应用
  • 自动化备份全网服务器数据平台
  • UE材质World Position 和 Object Position
  • Linux操作系统从入门到实战(十七)进程与进程基本概念
  • Redis一站式指南一:从MySQL事务到Redis持久化及事务实现
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • 计算机视觉(CV)——pytorch张量基本使用
  • 青龙峡拔韭菜
  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • 免费数字人API开发方案
  • 使用正则表达式检测Base64字符串并提取图片类型及正文的JavaScript函数,代码精简且高效
  • How Websites Work 网站如何运作
  • Linux入门指南:26个基础命令全解析