封装一个包含上传和下载文件功能的 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. docker save与docker export实现docker镜像与容器的备份

    本来想写一篇关于docker save/export/commit/load/import之间的关系的文章,后来看了看,已经有很多人写过了,我就不做重复工作了. 参见: docker save与doc ...

  2. 使用Java将视频中某一帧抽取为封面图片

    由于业务需求需将视频中的某帧进行截取作为该视频封面,网上太多教程过于复杂麻烦,经本人研究发现可以使用Java调用FFmpeg来进行处理. /** * 获取指定的视频文件后进行封面截图为png并保存到指 ...

  3. Qt编写可视化大屏电子看板系统18-柱状分组图

    一.前言 柱状分组图是柱状堆积图的衍生或者另外一种展示效果,设置的数据值数据源集合完全一样,只不过就是把柱子给拿下来了放在旁边,然后一个分组多个柱子横向排列,不同分组之间有一定的空隙隔开,默认QCus ...

  4. IntelliJ IDEA安装与配置(支持最新2020.2)

    前言 我是从eclipse转IDEA的,对于习惯了eclipse快捷键的我来说,转IDEA开始很不习惯,IDEA快捷键多,组合多,记不住,虽然可以设置使用eclipse的快捷键,但是总感觉怪怪的.开始 ...

  5. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

    本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...

  6. MPC收藏

    收集有关MPC的优秀文章,方便查阅. 同态加密 原理 介绍 程序员的干货!核心理论之同态加密 https://mp.weixin.qq.com/s/1uH0UjnS_Mo8ShXJ-16UXw BGV ...

  7. ABC237

    ABC237 F 题目大意 求长度为 \(n\) 且最长上升子序列长度恰好为 \(3\) 的序列 \(a\) 的个数(\(1 \leq a_i \leq m\)). 解题思路 不难判断这道题是一道线性 ...

  8. 4. 使用sql查询excel内容

    1. 简介 我们在前面的文章中提到了calcite支持csv和json文件的数据源适配, 其实就是将文件解析成表然后以文件夹为schema, 然后将生成的schema注册到RootSehema(Roo ...

  9. day05-面向对象编程:基础语法

    Java面向对象:类的基础语法 [ 任务列表 ] 1.面向对象快速入门 2.什么是面向对象 3.类的基础语法--构造器 4.类的基础语法--this关键字 5.类的基础语法--封装 6.类的基础语法- ...

  10. Linux安装Python 3.11

    Linux安装python 在Linux上安装Python 3.11,你可以按照以下步骤进行.这些步骤以CentOS为例,但其他Linux发行版的过程大同小异,可能只需稍作调整. 1. 检查Pytho ...