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的宽高,根 ...
随机推荐
- LNMP Wordpress phpMyAdmin的部署记录
背景 CentOS 8.2服务器,使用的虚拟服务器.只开放22与80端口.设置默认页面是wordpress的入口,phpmyadmin使用虚拟目录的形式进行访问. 安装 总体思路按照此文章进行.我进行 ...
- IntelliJ IDEA生成jar包运行报Error:A JNI error has occurred,please check your installation and try again
首先介绍一下IntelliJ IDEA生成jar包的方式: 1.打开项目,打开FIile->Project Structure...菜单.如下图: 选中Artifacts,点+号,选择JAR,再 ...
- [转]CMake菜谱(CMake Cookbook中文版)
CMake菜谱(CMake Cookbook中文版) 翻译 搜索 复制
- C#中工作线程处理完数据后将处理结果返回给UI主线程通知主线程操作界面
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Verilog3_组合逻辑电路
组合逻辑电路设计方法 使用assign语句: 描述简单的组合逻辑电路 使用always块: 描述复杂的组合逻辑电路 要点: 只在一个always模块中对某一变量进行赋值: 将所有敏感变量列在敏感变量列 ...
- Solution -「CF 1290F」Making Shapes
\(\mathscr{Description}\) 给定平面向量集 \(\newcommand{\vct}[1]{\boldsymbol{#1}}\{\vct v_n\}\),求从 \((0,0) ...
- CDS标准视图:维护策略描述 I_MaintStrategyTextData
视图名称:维护策略描述 I_MaintStrategyTextData 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Strategy ...
- springcloud-路由gateway-zuul
spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已.因为zuul ...
- w3cschool-Spring Cloud
https://www.w3cschool.cn/spring_cloud/spring_cloud-ryjs2ixg.html Spring Cloud(一)服务的注册与发现(Eureka) 202 ...
- ClickHouse-3引擎
引擎 数据库引擎 index 表引擎 数据库引擎 数据库引擎允许您处理数据表. 默认情况下,ClickHouse使用Atomic数据库引擎.它提供了可配置的table engines和SQL dial ...