分享axios+signalr简单封装示例

news2024/12/25 9:19:38

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为true
        if (!Global.isLoadingOpened) {
            Global.isLoadingOpened = true;
        }
        // 请求成功之后必须恢复isLoadingClosed为true
        if (!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 axios

const Global = {
    baseURl,
    session,
    storage,
    axiosMessage,
    publicAxiosRequest
}

export default Global

参见:

axios - npm

Axios中文文档 | Axios中文网

@microsoft/signalr - npm

SignalR 简介 | Microsoft Learn

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

ChatGPT等AI使用的过程苦笑不得瞬间

引言&#xff1a; 在人工智能的浪潮中&#xff0c;我们见证了技术的飞速发展和智能应用的广泛渗透。特别是随着语言模型的进步&#xff0c;AI如ChatGPT、文心一言、通义千问、讯飞星火等已经成为人们日常生活和工作中不可或缺的助手。然而&#xff0c;与任何新兴技术一样&#…

在云端构建和部署工作负载的最佳方式是怎样的?

如果要问当今企业希望从云计算中获得什么&#xff0c;那么 “低延迟” 以及 “更接近客户” 可能会是很多企业的首要目标。低延迟可以带来诸多好处&#xff0c;如提升用户满意度、增加竞争优势、降低运营成本等&#xff1b;更接近客户则有助于降低网络拥塞、减少数据丢失、符合…

【算法】一类支持向量机OC-SVM

【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机&#xff0c;从基础的回归和分类到后来的优化&#xff0c;在接触到支持向量机还有一类支持向量机的…

可免费使用的AI平台汇总 + 常用赋能科研的AI工具推荐

赋能科研&#xff0c;AI工具助你飞跃学术巅峰&#xff01;(推荐收藏) 文章目录 赋能科研&#xff0c;AI工具助你飞跃学术巅峰&#xff01;(推荐收藏)一、可免费使用的AI平台汇总1. ChatGPT2. New Bing3. Slack4. POE5. Vercel6. 其他平台7. 特定功能平台8. 学术资源平台9. 中文…

Linux学习——线程的控制

目录 ​编辑 一&#xff0c;线程的创建 二&#xff0c;线程的退出 1&#xff0c;在子线程内return 2,使用pthread_exit(void*) 三&#xff0c;线程等待 四&#xff0c;线程获取自己的id值 五&#xff0c;线程取消 六&#xff0c;线程分离 一&#xff0c;线程的创建 在对…

MySQL常见的索引类型介绍

我将为您详细讲解 MySQL 中常见的索引类型&#xff0c;以及它们的使用场景、特点、区别和优势。索引是提高数据库查询性能的关键工具&#xff0c;它可以加速数据检索速度&#xff0c;减少服务器的负担。在 MySQL 中&#xff0c;索引类型主要包括 B-Tree 索引、哈希索引、全文索…

025—pandas 根多列判断不在其他列的数据

思路 是有两个相同结构的数据表&#xff0c;已知第二个表是第一个表的部分数据&#xff0c;需要以其中两列为单位&#xff0c;判断在第一个表中存在&#xff0c;在另外一个表中不存在的数据。 思路&#xff1a; 我们先将 df1 和 df2 的 x、y 列取出&#xff0c;组合为元组形成…

深入探索HAProxy:高性能负载均衡器的奥秘

目录 引言 一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 &#xff08;二&#xff09;核心特性 &#xff08;三&#xff09;支持调度算法 二、安装haproxy &#xff08;一&#xff09;下载源码包 &#xff08;二&#xff09;解决依赖环境 &#xff08;三…

教你实现微信公众号消息每日自动推送-俘获妹子芳心

教你实现微信公众号消息每日自动推送-俘获妹子芳心,我们使用的是github的这个库。链接:https://github.com/limoest/daily_reminder 。作者的仓库已经有足够详细的教程。本文主要描述搭我自己的建过程,帮助更多小白一步一步搭建实现~ 首先要fork该项目 申请微信接口公众测试…

高端竞赛活动,财会知识竞赛复赛方案

复赛环节共计有48名选手参与&#xff0c;随机分为2组&#xff0c;每组24名选手&#xff0c;经过与预赛环节相同的关卡及赛制&#xff0c;即每组选手皆通过两轮关卡赛一轮复活赛&#xff0c;每组角逐12名选手晋级。2组共计24名选手晋级决赛&#xff0c;而未进入决赛的选手则获得…

分享软件项目实施方案模板

本项目在实施过程中将遵守做到以下几个方面&#xff1a; 与建设单位共同完成整个系统软件、网络等设计,负责系统的开发、测试、调试、人员培训、系统的试运行和交付&#xff0c;并保证系统质量。负责系统的维护、应用软件的升级和更新。提出对系统硬件设备的相关技术要求。在项…

redis源码分析

是什么 是基于内存(而不是磁盘)的kv(而不是关系型mysql那种)数据库&#xff0c;通过空间换时间 源码分析 跳表skiplist 假设你有个有序链表&#xff0c;你想看某个特定的值是否出现在这个链表中&#xff0c;那你是不是只能遍历一次链表才能知道&#xff0c;时间复杂度为O(n…

JavaEE--SpringBoot配置⽂件

配置文件的基本概念 properties的语法格式 读取配置文件的内容 properties的缺点 yml 主要使用yml yml的文件格式 先举一个例子&#xff0c;简单了解一下 验证结果如下&#xff1a; yml读取配置文件的内容 配置文件内容为空的时候的情况 配置内容为null时的情况 配置…

算法项目(7)—— 文本检索图片

本文包含什么? 免环境配置,实现文本搜索图片全套代码以及代码介绍运行有问题? csdn上后台随时售后.项目说明 本文主要实现用文本搜索数据库中图片的功能. 项目运行 代码地址在文末 点击链接后选择T4的GPU: 将云盘中的代码文件clip_search.tar拖到下图位置上传代码: 执行…

OD_2024_C卷_200分_9、园区参观路径【JAVA】【动态规划】

package odjava;import java.util.Scanner;public class 九_园区参观路径 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 长 -> 行数int m sc.nextInt(); // 宽 -> 列数int[][] matrix new int[n][m]; // 地图…

RK3568 xhci主控挂死问题

串口日志 rootjenet:~# [18694.115430] xhci-hcd xhci-hcd.1.auto: xHCI host not responding to stop endpoint command. [18694.125667] xhci-hcd xhci-hcd.1.auto: xHCI host controller not responding, assume dead [18694.125977] xhci-hcd xhci-hcd.1.auto: HC died; c…

SQLiteC/C++接口简介

上一篇&#xff1a;SQLite——世界上部署最广泛的开源数据库&#xff08;简介&#xff09; 引言&#xff1a; 作为一种轻量级、嵌入式关系型数据库&#xff0c;SQLite已经成为许多应用和系统的首选解决方案。它是一个开源软件库&#xff0c;以小型、快速和易于使用而著称。为…

利用yaml文件部署NacosXxl-job到阿里云的ACK

背景介绍 随着容器化的技术成熟落地&#xff0c;拥抱各种成熟的容器化集群平台是加速我们落地的必然之路&#xff0c;目前国内以阿里云、华为云、腾讯云为平台的供应商为主&#xff0c;国外则以AWS&#xff0c;Azure为主&#xff0c;让我们借助平台已有的优势进行快速落地提高…

zeta新增三个任务教程,即将刷新,速撸

这期是延续上期的教程&#xff0c;前面的任务不变&#xff0c;所以直接复制的前面的教程&#xff0c;多了三个任务更新在后面。 简单说一下&#xff0c;zeta是已经发币的公链项目&#xff0c;但是它社区还有6%的用户激励token份额没发完&#xff0c;做主网的几个简单任务可以获…