封装一个包含上传和下载文件功能的 axios 实例,可以提高代码的复用性和可维护性。以下是一个完整的封装示例,支持文件上传、下载、以及常规的 GET/POST 请求。


封装代码

import axios from 'axios';

// 创建 axios 实例
const http = axios.create({
baseURL: 'https://api.example.com', // 基础 URL
timeout: 10000, // 请求超时时间
headers: {
'Content-Type': 'application/json', // 默认请求头
},
}); /**
* 封装 GET 请求
* @param {string} url 请求地址
* @param {object} params 请求参数
* @returns {Promise} 返回请求结果
*/
export const get = (url, params = {}) => {
return http.get(url, { params });
}; /**
* 封装 POST 请求
* @param {string} url 请求地址
* @param {object} data 请求体数据
* @returns {Promise} 返回请求结果
*/
export const post = (url, data = {}) => {
return http.post(url, data);
}; /**
* 封装文件上传
* @param {string} url 请求地址
* @param {FormData} formData 表单数据
* @param {object} config 额外配置(如上传进度回调)
* @returns {Promise} 返回请求结果
*/
export const upload = (url, formData, config = {}) => {
return http.post(url, formData, {
headers: {
'Content-Type': 'multipart/form-data', // 设置为多部分表单
},
...config,
});
}; /**
* 封装文件下载
* @param {string} url 请求地址
* @param {object} params 请求参数
* @returns {Promise} 返回文件 Blob 数据
*/
export const download = (url, params = {}) => {
return http.get(url, {
params,
responseType: 'blob', // 响应类型为二进制流
});
}; // 请求拦截器
http.interceptors.request.use(
(config) => {
// 在请求发送之前做一些处理(如添加 token)
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
); // 响应拦截器
http.interceptors.response.use(
(response) => {
// 对响应数据做一些处理
return response.data;
},
(error) => {
// 对响应错误做一些处理
return Promise.reject(error);
}
); export default http;

使用示例

1. 发送 GET 请求

import { get } from './http';

get('/user', { id: 1 })
.then((data) => console.log(data))
.catch((error) => console.error(error));

2. 发送 POST 请求

import { post } from './http';

post('/user', { name: 'John', age: 30 })
.then((data) => console.log(data))
.catch((error) => console.error(error));

3. 上传文件

import { upload } from './http';

const fileInput = document.querySelector('input[type="file"]');
const formData = new FormData();
formData.append('file', fileInput.files[0]); upload('/upload', formData, {
onUploadProgress: (progressEvent) => {
const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
console.log(`上传进度: ${percent}%`);
},
})
.then((data) => console.log(data))
.catch((error) => console.error(error));

4. 下载文件

import { download } from './http';

download('/download', { fileId: 123 })
.then((blob) => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'file.pdf'; // 设置下载文件名
a.click();
window.URL.revokeObjectURL(url);
})
.catch((error) => console.error(error));

功能说明

  1. 请求拦截器

    • 在请求发送前统一添加 token 或其他请求头。
  2. 响应拦截器

    • 对响应数据进行统一处理,例如提取 data 字段或处理错误。
  3. 文件上传

    • 使用 FormData 对象,支持多部分表单上传。
    • 支持上传进度回调。
  4. 文件下载

    • 通过 responseType: 'blob' 获取二进制文件流。
    • 使用 URL.createObjectURL<a> 标签实现文件下载。
  5. 通用请求方法

    • 提供 getpost 方法,支持常规请求。

总结

这个封装实现了文件上传、下载以及常规请求的功能,同时通过拦截器统一处理请求和响应逻辑,适合大多数前端项目使用。

deepseek:封装一个axios的更多相关文章

  1. 用XHR简单封装一个axios

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 封装一个axios请求后台的通用方法

    import axios from 'axios'; import constant from '@/js/const'; import alert from '@/js/alertView'; le ...

  3. react封装基于axios的API请求

    一.最近做的一个后台管理项目,基于antd-pro做的,需要封装基于axios请求,便于开发,直接上代码. import axios from 'axios'; export const Method ...

  4. 自己封装一个Log模块

    Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...

  5. PHP封装一个通用好用的文件上传处理类

    封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...

  6. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  7. 使用xib封装一个自定义view的步骤

    使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...

  8. yii2封装一个类控制div宽度,高度

    1.首先,封装一个类,放在文件夹vendor下,命名为articls.php. <?phpclass Articles{ //测试    function add()    {        r ...

  9. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  10. IOS中封装一个View的思路

    一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...

随机推荐

  1. 【Python基础练习】实验3:列表、字典、集合

    实验3:列表.字典.集合 姓名:萌狼蓝天 时间:2023年11月6日 Python:3.12 博客:https://wwww.mllt.cc 实验目的 (1)了解列表.元组.字典和集合的概念 (2)学 ...

  2. 【Python】【MySQL】Python将JSON数据以文本形式存放到MySQL的Text类型字段中

    1.起因 在做一个自动打卡的玩意.登录会得到那个平台一系列的信息.我又不想专门修改.增加数据库字段来存放,所有打算直接将返回的JSON数据保存到一个MySQL字段中. 内容肯定不能直接放,考虑下比如数 ...

  3. 【Python自动化】selenium简单应用

    准备工作 查询浏览器版本 chrome://version/ 下载驱动 https://chromedriver.storage.googleapis.com/index.html 下载的驱动版本要和 ...

  4. 组件漏洞测试工具---Dependency-Check

    目录 文章综述 Dependency-Check简介 工作原理 常用命令 报告解读 使用场景 缺点 文章综述 本文主要介绍Dependency-Check工具的工作原理和使用方法,并提供一个开源方案帮 ...

  5. Halo博客+兰空图床搭建保姆级指南

    1. 简介 1.1 依赖的相关软件 Docker.Docker-Compose底层运行环境 Minio底层的存储支持 Mysql关系型数据库 Redis缓存中间件 NginxProxyManager( ...

  6. DataV Note:让Jupyter Notebook绽放新活力

    一.导读 Jupyter Notebook的官网定义:是一个基于网络的交互式计算平台.该笔记本结合了实时代码.方程式.叙述性文本.可视化.交互式仪表板和其他媒体.换句话来说,假如你有数据加工.数据分析 ...

  7. MS Webview2 拦截 interact/intercept

    https://docs.microsoft.com/en-us/microsoft-edge/webview2/how-to/webresourcerequested?tabs=dotnet 自定义 ...

  8. 面向对象(下)的阶段性复习:关键字abstract、模板方法的设计模式、关键字interface、代理模式、工厂的设计模式、类的结构内部类

    关键字:abstract abstract: 抽象的1.可以用来修饰:类.方法2.具体的:abstract修饰类:抽象类 * > 此类不能实例化 * > 抽象类中一定有构造器,便于子类实例 ...

  9. Kevin pg walkthrough Easy

    第二个window 靶机 尝试访问 80 web界面 然后是个登录界面 我尝试admin admin 登录成功 发现版本 发现了exp https://www.exploit-db.com/explo ...

  10. LeetCode刷题:343. 整数拆分的完全背包写法解析

    dp的含义表示:从前i个数中挑选,满足和为j的最大乘积为多少.由于是乘积所以dp初始均为1.i为2开始是因为从1开始挑选,j为2开始应为有效数字是从2开始. 进一步空间优化,应为dp[i][j]只与其 ...