deepseek:封装一个axios
封装一个包含上传和下载文件功能的 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));
功能说明
请求拦截器:
- 在请求发送前统一添加
token或其他请求头。
- 在请求发送前统一添加
响应拦截器:
- 对响应数据进行统一处理,例如提取
data字段或处理错误。
- 对响应数据进行统一处理,例如提取
文件上传:
- 使用
FormData对象,支持多部分表单上传。 - 支持上传进度回调。
- 使用
文件下载:
- 通过
responseType: 'blob'获取二进制文件流。 - 使用
URL.createObjectURL和<a>标签实现文件下载。
- 通过
通用请求方法:
- 提供
get和post方法,支持常规请求。
- 提供
总结
这个封装实现了文件上传、下载以及常规请求的功能,同时通过拦截器统一处理请求和响应逻辑,适合大多数前端项目使用。
deepseek:封装一个axios的更多相关文章
- 用XHR简单封装一个axios
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 封装一个axios请求后台的通用方法
import axios from 'axios'; import constant from '@/js/const'; import alert from '@/js/alertView'; le ...
- react封装基于axios的API请求
一.最近做的一个后台管理项目,基于antd-pro做的,需要封装基于axios请求,便于开发,直接上代码. import axios from 'axios'; export const Method ...
- 自己封装一个Log模块
Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...
- PHP封装一个通用好用的文件上传处理类
封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...
- Swift - 简单封装一个工具类模板
创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...
- 使用xib封装一个自定义view的步骤
使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...
- yii2封装一个类控制div宽度,高度
1.首先,封装一个类,放在文件夹vendor下,命名为articls.php. <?phpclass Articles{ //测试 function add() { r ...
- C 封装一个简单二叉树基库
引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而 没有遭受到冷 ...
- IOS中封装一个View的思路
一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...
随机推荐
- 中电金信:院长寄语|关于源启AI+行动的思考
自2022年8月19日发布以来,源启已经走上了她第三年的征途.今天,源启已经成为公司战略的支点,中电金信正致力于用"源启底座""源启+咨询""源启+应 ...
- Gitlab 实现仓库完全迁移
方法一:最快 gitlab用url导入注意事项看图 方法二 首先需要在新的服务服务器上新建一个项目 然后用 Git Bash 执行以下命令 git clone --mirror 项目原代码仓库地址 / ...
- Qt音视频开发5-vlc事件订阅
一.前言 事件订阅可以拿到文件长度.播放进度.播放状态改变等信息,vlc的事件订阅机制封装的比较友好,只需要先创建一个事件管理器,然后逐个订阅自己感兴趣的需要的事件,不感兴趣的可以不要订阅,只有订阅了 ...
- 微信后团队分享:微信后台基于Ray的分布式AI计算技术实践
本文由微信后台Astra项目团队分享,原题"Ray在微信AI计算中的大规模实践",下文进行了排版和内容优化. 1.引言 微信存在大量AI计算的应用场景,主要分为三种:流量分发.产品 ...
- 新一代python版本与依赖管理工具 uv
uv python版本与依赖管理 选择原因 1. 新的好玩.rust开发的执行速度快 2. 确实方便 3. 轻,软件就十几二十兆,占磁盘小 4. uv.lock可以锁版本 场景应用 场景一 从 ana ...
- Applitools_问题汇总
1. Android使用Real Device 问题1: AttributeError: 'NoneType' object has no attribute 'to_capabilities' 解 ...
- Volar Vetur 在 VSCode 里的配置
VSCode 对 vue2 vue3 项目如何配置 1. 在 vscode 安装 vetur.Vue - Official(之前叫 Volar) 两个插件 2.你若是 vue3 项目,直接在你项目工作 ...
- GD32F103C8T6入门——GPIO配置点亮LED
1.硬件 GD32F103C8T6最小系统板 ST-LINK V2下载器 2.GPIO说明 每个通用I/O端口都可以通过两个32位的控制寄存器(GPIOx_CTL0/ GPIOx_CTL1)和两个32 ...
- CompletableFuture 超时功能有大坑!使用不当直接生产事故!
CompletableFuture 超时功能有大坑!使用不当直接生产事故! 本文未经允许禁止转载! 上一篇文章<如何实现超时功能(以CompletableFuture为例)>中我们讨论了 ...
- redis渐进式rehash
本文分享自天翼云开发者社区<redis渐进式rehash>,作者:l****n Redis是k-v型数据库,其内部设计了一种dict类型的数据结构用来存储键值结构. dict 通常的存储结 ...