Axios封装一款前端项目网络请求实用插件

前端项目开发非常经典的插件axios大家都很熟悉,它是一个Promise网络请求库,可以用于浏览器和 node.js 支持的项目中。像一直以来比较火的Vue.js开发的几乎所有项目网络请求用的都是axios。那么我们在实际的项目中,有时候为了便于维护、请求头信息统一处理、统一拦截器设置以及响应数据统一处理,需要在项目中针对axios封装一个网络请求插件。接下来就介绍一下针对以上这些输出具体的解决方案和步骤。

封装前准备(安装axios插件)
#安装前先确定node.js版本,可以前往下载对应的nodejs版本:https://nodejs.org/zh-cn/download
yarn add axios

在这里插入图片描述

创建一个网络请求组件(用于提供对外访问)

axios-utils.js

/*** 能用网络请求* @param method {'GET'|'PUT'|'POST'|'DELETE'} 请求方式* @param url 请求相对或完整路径* @param params 请求对象参数* @param headers 请求头对象参数* @param thenCall 当请求状态码返回非成功或非对象时回调,便于异常数据统一处理* @returns {*} Promise*/
export function axiosapi(method = "post", url = '', params = {}, headers = {}, thenCall) {//创建axios对象实例let instance = axios.create({baseURL: "/api", //根url地址,这里设置的是代理地址(请看下面配置)//在跨域请求时,这个属性特别重要。根据浏览器的同源策略,为了安全起见,浏览器会阻止跨源HTTP请求。//通过设置 withCredentials为true,可以允许跨域请求时携带证书信息,从而绕过这个限制。withCredentials: true,//公共请求头信息设置headers: {"token": getToken(),"version": "1.0.2"}});//设置本次网络请求拦截器instance.interceptors.request.use((config) => {//这里处理你的请求拦截信息return config;}, function (error) {return Promise.reject(error);});//设置本次网络请求响应拦截器instance.interceptors.response.use((res) => {//这里处理你的响应拦截信息return res;}, (error) => {//解决请求异常时网页出现ERR_BAD_REQUEST错误导致功能不能使用情况,需要返回空的Promise对象if (error.code === 'ERR_BAD_REQUEST') {Promise.resolve({});} else {return Promise.reject(error);}});return request.axiosRequest(instance, method, url, params, headers, thenCall);
}

本地代理地址配置(仅在开发时生效)

devServer: {proxy: {'/api/*': {target: 'https://xxx.xxxx.com/',changeOrigin: true,pathRewrite: {'^/api': '/'}}}
},
封装axiosRequest网络请求核心组件(axios-request.js)

网络请求post请求参数梳理

if (type == "post" || type == "POST") {//如果文件上传则创建FormData对象再将数据赋值给data,否则直接将参数赋值给data对象if (params && headers["Content-Type"] == "multipart/form-data") {let formData = new FormData();for (let field in params) {if (field == "file") {let file = params[field];formData.append('file', file, file.name || '');} else {formData.append(field, params[field]);}}requestParams["data"] = formData;} else {requestParams["data"] = params;}
}

对delete、put请求参数处理,自动将请求参数转成query方式,这样做在实际调用时可以不需要考虑具体传参方式

if (type == "delete" || type == "DELETE" || type == "put" || type == "PUT") {//如果是delete和put自动将请求参数转成query方式,这样做在实际调用时可以不需要考虑具体传参方式for (let paramsKey in params) {url = updateQueryStringParameter(url, paramsKey, params[paramsKey]);}
}function updateQueryStringParameter(uri, key, value) {let re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");let separator = uri.indexOf('?') !== -1 ? "&" : "?";if (uri.match(re)) {return uri.replace(re, '$1' + key + "=" + value + '$2');} else {return uri + separator + key + "=" + value;}
}

axios网络统一请求
这里除了put其它都以能用的方式axios.create({})处理,因为put不支持接收axios.create({“method”:“PUT”})方式

if (type == "put" || type == "PUT") {instance.put(url, requestParams).then(res => {//这里处理你的返回数据,可以回调抛出去,下面给出完整示例中带有数据响应处理handleResult// that.handleResult(true, res, resolve, reject, thenCall);}).catch(res => {//这里处理你的异常数据,可以回调抛出去,下面给出完整示例中带有数据响应处理handleResult// that.handleResult(false, res, resolve, reject, thenCall);});
} else {requestParams["method"] = type;requestParams["url"] = url;instance(requestParams).then(res => {//这里处理你的返回数据,可以回调抛出去,下面给出完整示例中带有数据响应处理handleResult// that.handleResult(true, res, resolve, reject, thenCall);}).catch(res => {//这里处理你的异常数据,可以回调抛出去,下面给出完整示例中带有数据响应处理handleResult// that.handleResult(false, res, resolve, reject, thenCall);});
}

请求插件axios-request.js完整代码

function updateQueryStringParameter(uri, key, value) {let re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");let separator = uri.indexOf('?') !== -1 ? "&" : "?";if (uri.match(re)) {return uri.replace(re, '$1' + key + "=" + value + '$2');} else {return uri + separator + key + "=" + value;}
}export default {request: function (axiosInstance, type = "", url = "", headers = {}, params = {}, requestHandle, thenCall) {if (type == "post" || type == "POST") {//当post请求时以json方式提交数据if (!headers["Content-Type"]) {headers["Content-Type"] = "application/json;charset=utf-8";}}//将请求包装一个Promise立即返回return new Promise((resolve, reject) => {if (requestHandle) {requestHandle(axiosInstance, url, params, headers, resolve, reject, thenCall);}});},axiosRequest: function (axiosInstance, type = '', url = '', params = {}, headers = {}, thenCall) {let that = this;return that.request(axiosInstance, type, url, headers, params, function (instance, url, params, headers, resolve, reject, thenCall) {let requestParams = {headers: headers};if (type == "post" || type == "POST") {//如果文件上传则创建FormData对象再将数据赋值给data,否则直接将参数赋值给data对象if (params && headers["Content-Type"] == "multipart/form-data") {let formData = new FormData();for (let field in params) {if (field == "file") {let file = params[field];formData.append('file', file, file.name || '');} else {formData.append(field, params[field]);}}requestParams["data"] = formData;} else {requestParams["data"] = params;}} else if (type == "delete" || type == "DELETE" || type == "put" || type == "PUT") {//如果是delete和put自动将请求参数转成query方式,这样做在实际调用时可以不需要考虑具体传参方式for (let paramsKey in params) {url = updateQueryStringParameter(url, paramsKey, params[paramsKey]);}} else {//否则直接将参数赋值给请求对象requestParams["params"] = params;}//这里除了put其它都以能用的方式axios.create({})处理,因为put不支持接收axios.create({"method":"PUT"})方式if (type == "put" || type == "PUT") {instance.put(url, requestParams).then(res => {that.handleResult(true, res, resolve, reject, thenCall);}).catch(res => {that.handleResult(false, res, resolve, reject, thenCall);});} else {requestParams["method"] = type;requestParams["url"] = url;instance(requestParams).then(res => {that.handleResult(true, res, resolve, reject, thenCall);}).catch(res => {that.handleResult(false, res, resolve, reject, thenCall);});}}, thenCall);}
}
设置全局拦截器

通过全局请求拦截器,可以在每个请求发送前执行一些固定的操作,比如添加认证信息(如Token)、设置请求头、统一错误处理等。这有助于减少重复代码,并保持应用程序的一致性。

import Vue from 'vue';
import VueAxios from 'vue-axios';
import axios from 'axios';Vue.use(VueAxios, axios);// 设置统一的url
axios.defaults.baseURL = "/api";axios.interceptors.request.use((config) => {// 这里可以添加公共头信息return config;
}, function (error) {return Promise.reject(error);
});
请求示例
await axiosapi('get', '/user/login', {
"user":"admin",
"password":"123456",
....
});

错误返回数据结构

{"code": xxx, //请求状态码"msg": "请求状态消息"
}

成功返回数据结构

{"code": 0, //0-成功"msg": "success","data":{xxx} //响应数据信息
}

哦了,感谢你看到这里也请动动您的鼠标和小手关注一下我吧,同时也期待您在评论区提出建议,可以使我创作更优质的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3145.html

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

相关文章

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序:**5.2**析构函数调用顺序:**5.3调…

LDD3学习8--linux的设备模型(TODO)

在LDD3的十四章,是Linux设备模型,其中也有说到这个部分。 我的理解是自动在应用层也就是用户空间实现设备管理,处理内核的设备事件。 事件来自sysfs和/sbin/hotplug。在驱动中,只要是使用了新版的函数,相应的事件就会…

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频 指定url发送请求 UA伪装请求页面 获取想要的数据 解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如…

从AI原理到模型演进及代码实践 的学习二

参考:全面解析:从AI原理到模型演进及代码实践-CSDN博客 训练过程 Transformer仅一个Encoder模块就可以工作,可以处理信息抽取、识别、主体识别等任务,比如 BERT(Bidirectional Encoder Representations from Transfor…

利用EXCEL进行XXE攻击

0X00 前言 CTF 选手都清楚我们像 word 文档格式改成 zip 格式后,再解压缩可以发现其中多数是描述工作簿数据、元数据、文档信息的 XML 文件。实际上,与所有 post-Office 2007 文件格式一样,现代 Excel 文件实际上只是 XML 文档的 zip 文件。…

在Mac mini上实现本地话部署AI和知识库

在Mac mini上实现本地话部署AI和知识库 硬件要求:大模型AI,也叫LLM,需要硬件支持,常见的方式有2种:一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片;第二种是采用苹果M系列芯片架构的支持统一内存架…

鸿蒙UI(ArkUI-方舟UI框架)-开发布局

文章目录 开发布局1、布局概述1)布局结构2)布局元素组成3)如何选择布局4)布局位置5)对子元素的约束 2、构建布局1)线性布局 (Row/Column)概述布局子元素在排列方向上的间距布局子元素在交叉轴上的对齐方式(…

指针的进阶

指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节(32位平台/64位平台&#xff0…

B站评论系统的多级存储架构

1. 背景 评论是 B站生态的重要组成部分,涵盖了 UP 主与用户的互动、平台内容的推荐与优化、社区文化建设以及用户情感满足。B站的评论区不仅是用户互动的核心场所,也是平台运营和用户粘性的关键因素之一,尤其是在与弹幕结合的情况下&#xf…

若依分页插件失效问题

若依对数据二次处理导致查询total只有十条的问题处理办法_若依分页查询total-CSDN博客

css盒子水平垂直居中

目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…

Golang Gin系列-3:Gin Framework的项目结构

在Gin教程的第3篇,我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是,而是要对所有东西的位置做出明智的选择。相信我,这些东西很重要。如果你做得对,你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…

03JavaWeb——Ajax-Vue-Element(项目实战)

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序&#xf…

【无法下载github文件】虚拟机下ubuntu无法拉取github文件

修改hosts来进行解决。 步骤一:打开hosts文件 sudo vim /etc/hosts步骤二:查询 github.com的ip地址 https://sites.ipaddress.com/github.com/#ipinfo将github.com的ip地址添加到hosts文件末尾,如下所示。 140.82.114.3 github.com步骤三…

【Idea启动项目报错NegativeArraySizeException】

项目场景: Idea启动项目报错(打包不报错),项目在服务器部署运行没有问题,尝试了重启idea、重启电脑、maven clean/install 都不行 maven-resources-production:sample: java.lang.NegativeArraySizeException: -5833…

【 MySQL 学习2】常用命令

文章目录 一、基础命令1.1、登录1.2 、退出1.3、查看数据库中有哪些数据库1.4 、选择使用的数据库1.5、创建数据库1.6 查看哪个数据库下有哪些表 二、SQL语句的分类2.1 DQL 数据查询语言2.2 DML 数据操作语言2.3 DDL 数据定义语言2.4 TCL 事物控制语言2.5 DCL 数据控制语言 三、…

JVM直击重点

JVM直击重点 JVM内存模型 JVM中类加载器分类与核心功能 Java里有如下几种类加载器 引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等 扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的e…

图数据库 | 18、高可用分布式设计(中)

上文我们聊了在设计高性能、高可用图数据库的时候,从单实例、单节点出发,一般有3种架构演进选项:主备高可用,今天我们具体讲讲分布式共识,以及大规模水平分布式。 主备高可用、分布式共识、大规模水平分布式&#xff…

【常见BUG】Spring Boot 和 Springfox(Swagger)版本兼容问题

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…