基于 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.pswp.cn/pingmian/92704.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92704.shtml

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

相关文章

PowerDesigner生成带注释的sql方法

前提是name里面是有文字的: 方法开始: 第一步: Database → Edit Current DBMS → Script → Objects → Column → Add 把输出模板改成: %20:COLUMN% %30:DATATYPE%[.Z:[%Compressed%? compressed][ %NULLNOTNULL%][%IDENTITY…

猎板PCB:专业键盘PCB板解决方案供应商

猎板PCB深耕印刷电路板(PCB)制造领域,凭借前沿技术与深厚积淀,在键盘PCB板细分市场积极布局,致力于为不同客户提供多样化、高性能的键盘PCB板产品,满足多元需求。一、定义:键盘PCB板键盘PCB板&a…

基于 Spring Boot 的登录功能实现详解

在 Web 应用开发中,登录功能是保障系统安全的第一道防线。本文将结合实际代码,详细解析一个基于 Spring Boot 框架的登录功能实现,包括验证码生成、用户验证、Token 机制等关键环节。技术栈概览本登录功能实现涉及以下核心技术和组件&#xf…

vue+django 大模型心理学智能诊断评测系统干预治疗辅助系统、智慧心理医疗、带知识图谱

vuedjango 大模型心理学智能诊断评测系统干预治疗辅助系统、智慧心理医疗、带知识图谱文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处!编号:D003 pro基于大模型心理学问卷、智能诊断&…

【linux】企业级WEB应用服务器tomcat

一 WEB技术1.1 HTTP协议和B/S 结构操作系统有进程子系统,使用多进程就可以充分利用硬件资源。进程中可以多个线程,每一个线程可以被CPU调度执行,这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。客户…

【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题

【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题 本文将完整梳理 Unity 中通过 SceneManager.LoadSceneAsync 使用 Additive 模式加载子场景时出现的卡顿问题,分析其本质,提出不同阶段的…

B 树与 B + 树解析与实现

一、磁盘存储优化的核心逻辑 在大规模数据处理场景中,磁盘 I/O 效率是性能瓶颈的核心。磁盘访问具有以下特性: 随机访问成本高:磁头寻道时间(Seek Time)可达毫秒级,相比内存访问(纳秒级&#…

MySQL 查询相同记录并保留时间最晚的一条

要在 MySQL 中查询相同记录并仅保留时间最晚的那一条,你可以使用以下几种方法:方法一:使用子查询和 GROUP BY假设你的表名为 your_table,时间字段为 create_time,其他用于判断记录相同的字段为 field1, field2 等&…

在 .NET Core 5.0 中启用 Gzip 压缩 Response

在 .NET Core 5.0 中启用 Gzip 压缩 Response 在 .NET Core 5.0 (ASP.NET Core 5.0) 中启用 Gzip 压缩主要通过响应压缩中间件实现。以下是详细配置步骤: 1. 安装必要的 NuGet 包 首先确保已安装响应压缩包: dotnet add package Microsoft.AspNetCore.Re…

[Oracle] TRUNC()函数

TRUNC() 是 Oracle 中一个多功能函数,主要用于对数值、日期进行截断操作1.TRUNC()函数用于数值处理语法格式TRUNC(number, decimal_places)参数说明number:要截断的数值 decimal_places:保留的小数位数(可选),默认为0(截断所有小数…

GPT-oss:OpenAI再次开源新模型,技术报告解读

1.简介OpenAI 发布了两款开源权重推理模型 gpt-oss-120b 与 gpt-oss-20b,均采用 Apache 2.0 许可,主打在代理工作流中执行复杂推理、调用工具(如搜索、Python 代码执行)并严格遵循指令。120b 为 36 层 MoE 结构,活跃参…

python tcp 框架

目录 python tcp 框架 asyncio websockets python tcp 框架 asyncio import asyncio import json import timeclass TCPClient:def __init__(self, host, port, heartbeat_interval10):self.host hostself.port portself.heartbeat_interval heartbeat_intervalself.read…

HTML 与 CSS:从 “认识标签” 到 “美化页面” 的入门指南

个人主页:♡喜欢做梦 目录 🎠HTML 🎡一、什么是HTML? ⛲️1.定义 ⛲️2.核心特点 ⛲️3.HTML的基本结构 ⛲️4.标签的层次结构关系 🎡二、HTML的常用标签 🌅1.文本列表标签 标题标签:h…

【MATLAB 2025a】安装离线帮助文档

文章目录一、在 MATLAB 设置中安装二、从math works 网站下载ISO:适用于给无法联网的电脑安装或自定义路径三、startup文件说明四、重要说明🧩🧩【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线! 版本&#…

Linux系统编程Day8 -- Git 教程(初阶)

往期内容回顾 基于Linux系统知识的第一个程序 自动化构建工具-make/Makefile gcc/g编译及链接 Vim工具的使用 Linux常用工具&#xff08;yum与vim&#xff09; ​​​​​​ Linux系统编程Day4-- Shell与权限 回顾进度条程序的编写&#xff1a; //.h文件内容 #include<stdio…

React18 Transition特性详解

Transition 核心概念&#xff1a;Transition是一种标记非紧急任务更新的机制&#xff0c;它允许React在用户交互&#xff08;如输入&#xff09;期间保持界面的响应&#xff0c;同时准备后台更新 主要特点&#xff1a; 区分优先级&#xff1a;可以将更新分为紧急非紧急任务可中…

OpenHarmony概述与使用

1. OpenHarmony Hi3861 学习目标与任务 硬件基础知识&#xff1a;涵盖嵌入式硬件体系架构&#xff08;如 MCU 基础、硬件接口原理 &#xff09;、硬件设计流程&#xff08;原理图绘制、PCB Layout 规范 &#xff09;&#xff0c;了解常见硬件外设&#xff08;传感器、通信模…

大模型提示词工程实践:大语言模型文本转换实践

大模型文本转换 学习目标 在本课程中&#xff0c;我们将探究如何使用大语言模型来完成文本转换任务&#xff0c;例如语言翻译、拼写和语法检查、语气调整以及格式转换。 相关知识点 大模型文本转换 学习内容 1. 大模型文本转换 文本转换的核心定义与范畴 文本转换 是指通过技术…

力扣LCR024:反转链表206.反转链表双解法(经典面试题)

LCR 024. 反转链表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反转链表 - 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]输入&#xff1a…

Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎

Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎 📚 核心概念(5分钟理解) 什么是CNN卷积神经网络? 核心概念解释: CNN(Convolutional Neural Network): 专门处理具有网格状拓扑结构数据的深度学习模型,特别擅长图像识别 为什么需要: 传统全连接神经网络处理图像时参数量…