分享axios+signalr简单封装示例

Ajax Axios

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

从浏览器创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
取消请求
超时处理
查询参数序列化支持嵌套项处理
自动将请求体序列化为:
JSON (application/json)
Multipart / FormData (multipart/form-data)
URL encoded form (application/x-www-form-urlencoded)
将 HTML Form 转换成 JSON 进行请求
自动转换JSON数据
获取浏览器和 node.js 的请求进度,并提供额外的信息(速度、剩余时间)
为 node.js 设置带宽限制
兼容符合规范的 FormData 和 Blob(包括 node.js)
客户端支持防御XSRF

SignalR

实时 Web 功能是让服务器代码在可用时立即将内容推送到连接的客户端,而不是让服务器等待客户端请求新数据。SignalR 可用于向 ASP.NET 应用程序添加任何类型的“实时”Web 功能。 虽然聊天通常用作示例,但你可以执行更多操作。 每当用户刷新网页以查看新数据,或页面实现 长时间轮询 以检索新数据时,它都是使用 SignalR 的候选项。 示例包括仪表板和监视应用程序、协作应用程序 (,例如同时编辑文档) 、作业进度更新和实时表单。

SignalR 还支持需要服务器进行高频率更新的全新 Web 应用程序类型,例如实时游戏。

SignalR 提供了一个简单的 API,用于创建服务器到客户端远程过程调用, (RPC) 调用客户端浏览器中的 JavaScript 函数, (和其他客户端平台从服务器端 .NET 代码) 。 SignalR 还包括用于连接管理的 API (例如,连接和断开连接事件) ,以及分组连接。

import axios from 'axios'
import * as signalR from '@microsoft/signalr'// baseURl 系统默认网址
const baseURl = process.env.VUE_APP_API_URL/** @session* 封装sessionStorage常用方法的对象* set: 设置sessionStorage要存储的值* get: 从sessionStorage中获取值* remove: 从sessionStorage中删除值* clean: 清空sessionStorage所有存储值*/
let session = {set: (key, value) => {if (typeof value == 'object') {window.sessionStorage.setItem(key, JSON.stringify(value));} else {window.sessionStorage.setItem(key, value);}},get: (key) => {var result = window.sessionStorage.getItem(key);if (Global.isJsonFormat(result)) {return JSON.parse(result);} else {return result;}},remove: (key) => {window.sessionStorage.removeItem(key);},clean: (key) => {window.sessionStorage.clear();}
}/** @storage* 封装localStorage常用方法的对象* set: 设置localStorage要存储的值* get: 从localStorage中获取值* remove: 从localStorage中删除值* clean: 清空localStorage所有存储值*/
let storage = {set: (key, value) => {if (typeof value == 'object') {window.localStorage.setItem(key, JSON.stringify(value));} else {window.localStorage.setItem(key, value);}},get: (key) => {var result = window.localStorage.getItem(key);if (Global.isJsonFormat(result)) {return JSON.parse(result);} else {return result;}},remove: (key) => {window.localStorage.removeItem(key);},clean: (key) => {window.localStorage.clear();}
}/** @axiosMessage* 封装axios请求消息提示* type: 提示类型|msg: 提示消息|callBack: 消息关闭时的回调函数|settings: 其他配置项*/
let axiosMessage = (type, msg, callBack, settings) => {let defaultSettings = {type: type,message: msg,duration: 2000,showClose: true,onClose: callBack ? callBack : null};if (settings && typeof settings == 'object') {for (let p in settings) {defaultSettings[p] = settings[p];}}Message(defaultSettings);
}/** @publicAxiosRequest* 封装公用的axios请求处理方法* params: 请求参数|axiosFunc: axios请求|callBack: 请求成功执行的回调函数|closeLoading: 是否开启Loading效果*/
let publicAxiosRequest = (params, axiosFunc, callBack, closeLoading) => {Global.isLoadingOpened = typeof closeLoading == 'undefined' ? true : closeLoading;axiosFunc(params).then((res) => {let { code, data, message } = res;if (code >= 200 && code < 300) {callBack(data, message);} else {let requestMsg = '';if (typeof message == 'object') {for (let key in message) {requestMsg += message[key].join('、');}} else {requestMsg = message;}Global.axiosMessage('error', requestMsg, Global.endLoading);}}).catch((e) => {Global.endLoading();console.info(e);});
}// 记录响应错误提示次数
let errorCount = 0/** axios请求拦截*/
axios.interceptors.request.use(config => {// 添加取消请求config.cancelToken = new axios.CancelToken(cancel => {store.commit('PUSH_TOKEN', { cancelToken: cancel });});// 判断是否开启Loading效果if (Global.isLoadingOpened) {Global.startLoading();}// 配置token信息if (Global.storage.get('requestToken')) {config.headers.Authorization = 'Bearer ' + Global.storage.get('requestToken');}return config;},error => {return Promise.reject(error);}
)/** axios响应拦截*/
axios.interceptors.response.use(response => {// 请求成功之后必须恢复isLoadingOpened为trueif (!Global.isLoadingOpened) {Global.isLoadingOpened = true;}// 请求成功之后必须恢复isLoadingClosed为trueif (!Global.isLoadingClosed) {Global.isLoadingClosed = true;}if (Global.isLoadingClosed) {setTimeout(() => {Global.endLoading();}, 200);}return response;},error => {// 判断是否是被取消请求的响应错误if (axios.isCancel(error)) {// 中断promise链接return new Promise(() => {// 判断是否有Loading加载效果没有关闭if (Global.requestLoading) {setTimeout(() => {Global.endLoading();}, 200);}});} else {if (error.response && error.response.status) {errorCount++;let msg = '';switch (error.response.status) {case 404: // 请求不存在msg = '请求不存在,请重新登录';break;case 417: // 没有操作权限msg = '没有操作权限,请联系管理员设置';break;case 500: // 服务器异常msg = '服务器异常,请稍后操作';break;default: // 其他错误msg = error.response.data.message;}// 多个错误提示时只弹出一个提示框if (errorCount < 2) {Global.confirmBox('warning', msg, '提示', () => {Global.session.clean();Global.storage.clean();window.location.href = window.location.origin + '/#/';});}return Promise.reject(error.response);}}}
)// 初始化signalr
export const initSignalr = (func1) => {const signalrAddress = process.env.VUE_APP_API_URL,AccessToken = Global.storage.get('requestToken'),TenantId = Global.storage.get('companyId') ? Global.storage.get('companyId') : '';let connection = new signalR.HubConnectionBuilder().withUrl(signalrAddress + '/hubs/chathub?access_token=' + AccessToken + '&TenantId=' + TenantId) // signalr连接地址.withAutomaticReconnect({ nextRetryDelayInMilliseconds: () => 50000 }) // 断开自动重连.build();// 监听断开重连connection.onreconnected(connectionId => {console.log('重新连接成功', connectionId);});// 监听连接关闭connection.onclose(err => {console.log('连接关闭', err);});// 注册后端调用的方法(接收数据)connection.on('ReceiveMessage', func1);// 开始连接connection.start().then(res => {console.info('%c连接成功', 'color: #03d903');}).catch(err => {console.info('%c连接失败', 'color: #ff0000');});return connection;
}// 推送数据给后端
export const sendMessage = (signalr, data) => {if (signalr) {signalr.send('SendMessage', data).then(res => {console.log('推送成功', res);});}
}// 关闭signalr
export const closeSignalr = (signalr) => {if (signalr) {signalr.stop();signalr = null;}
}// 【登录】获取token信息
export const userLogin = (params) => { return axios.post(`${REQUEST_URL}/api/login`, params).then(res => res.data) }export default axiosconst Global = {baseURl,session,storage,axiosMessage,publicAxiosRequest
}export default Global

参见:

axios - npm

Axios中文文档 | Axios中文网

@microsoft/signalr - npm

SignalR 简介 | Microsoft Learn

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

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

相关文章

C++容器适配器stack、queue、priority_queue

文章目录 C容器适配器stack、queue、priority_queue1、stack1.1、stack的介绍1.2、stack的使用1.3、stack的模拟实现 2、queue2.1、queue的介绍2.2、queue的使用2.3、queue的模拟实现 3、priority_queue3.1、priority_queue的介绍3.2、priority_queue的使用3.3、仿函数3.4、pri…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Navigation)

Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;NavDestination的子组件…

mybatisplus的条件构造器

条件构造器wrapper&#xff0c;主要用于构造sql语句的where条件&#xff0c;他更擅长这个&#xff0c;但也可以用于构造其他类型的条件&#xff0c;比如order by、group by等。 条件构造器的使用经验&#xff1a; 基于QueryWrapper的查询 练习1. void testQueryWrapper(){Q…

分库分表浅析原理

数据库存放数据大了&#xff0c;查询等操作就会存在瓶颈&#xff0c;怎么办&#xff1f; 1. 如果是单张表数据大了&#xff0c;可以在原有库上新建几张表table_0、table_1、table_2、.....table_n 写程序对数据进行分表&#xff1a; --这里提供一种一种分表策略,这里只需维护…

2024蓝桥杯每日一题(时间日期)

一、第一题&#xff1a;日期差值 解题思路&#xff1a;模拟 写一个计算时间的板子两者相减 【Python程序代码】 mon [0,31,28,31,30,31,30,31,31,30,31,30,31] def pd(x):if x%4000 or (x%40 and x%100!0):return Truereturn False def get_day(y,m,d):res 0for i …

【机器学习】无监督学习算法之:层次聚类

层次聚类 1、引言2、层次聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 这周末过的滋润啊。 小鱼&#xff1a;… 每个周末都挺滋润的啊。 小屌丝&#xff1a;啊~ ~ 你这… 小鱼&#xff1a;周末加班&#xf…

C语言实现贪吃蛇

前言&#xff1a;今天给大家详细介绍一下小游戏贪吃蛇的代码。 目录 一 .贪吃蛇实现的功能 二.贪吃蛇游戏设计与分析 1.贪吃蛇以及贪吃蛇所需要维护的数据 &#xff08;1&#xff09;贪吃蛇蛇体 &#xff08;2&#xff09;数据维护 2.地图设计 &#xff08;1&#x…

第16章——西瓜书强化学习

在强化学习中&#xff0c;智能体通过与环境的交互来学习如何做出决策。在每个时间步&#xff0c;智能体观察当前的环境状态&#xff0c;并根据其策略选择一个动作。环境会对智能体的动作做出响应&#xff0c;并给出一个奖励信号&#xff08;reward&#xff09;&#xff0c;该信…

【DH法】——机器人运动学正逆解

描述关节姿态 串联机器人的关节由电机连杆组成&#xff0c;如下图所示&#xff1a; 图1 PUMA560机器人结构模型 图2 PUMA560机器人实物 PUMA 560 robot in the experiment. | Download Scientific Diagram (researchgate.net)

车载诊断协议DoIP系列 —— AL IPv6地址分配通用DoIP报头结构

车载诊断协议DoIP系列 —— AL IPv6地址分配&通用DoIP报头结构 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自…

题目:珠宝的最大交替和(蓝桥OJ 3791)

问题描述&#xff1a; 解题思路&#xff1a;&#xff08;思路样例从0开始赋值&#xff09; 注意点&#xff1a;1.S需要开long long 2.需要考虑如果交换的差值&#xff08;即Aj - Ai)为负数的情况。 题解&#xff1a;&#xff08;实例代码为从1开始赋值&#xff0c;因此奇偶要与…

来,我们把LangChain了解一下

目录 LangChain简介 LangChain Experssion Language 常见API key申请 LangChain简介 最近要学的东西可太多了&#xff0c;好的&#xff0c;我们先来看看LangChain是什么东西&#xff0c;咱就是说开干吧&#xff1a; pip install langchain Get started吧&#xff1a;Get …