当前位置:   article > 正文

分享axios+signalr简单封装示例

分享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 (例如,连接和断开连接事件) ,以及分组连接。

  1. import axios from 'axios'
  2. import * as signalR from '@microsoft/signalr'
  3. // baseURl 系统默认网址
  4. const baseURl = process.env.VUE_APP_API_URL
  5. /*
  6. * @session
  7. * 封装sessionStorage常用方法的对象
  8. * set: 设置sessionStorage要存储的值
  9. * get: 从sessionStorage中获取值
  10. * remove: 从sessionStorage中删除值
  11. * clean: 清空sessionStorage所有存储值
  12. */
  13. let session = {
  14. set: (key, value) => {
  15. if (typeof value == 'object') {
  16. window.sessionStorage.setItem(key, JSON.stringify(value));
  17. } else {
  18. window.sessionStorage.setItem(key, value);
  19. }
  20. },
  21. get: (key) => {
  22. var result = window.sessionStorage.getItem(key);
  23. if (Global.isJsonFormat(result)) {
  24. return JSON.parse(result);
  25. } else {
  26. return result;
  27. }
  28. },
  29. remove: (key) => {
  30. window.sessionStorage.removeItem(key);
  31. },
  32. clean: (key) => {
  33. window.sessionStorage.clear();
  34. }
  35. }
  36. /*
  37. * @storage
  38. * 封装localStorage常用方法的对象
  39. * set: 设置localStorage要存储的值
  40. * get: 从localStorage中获取值
  41. * remove: 从localStorage中删除值
  42. * clean: 清空localStorage所有存储值
  43. */
  44. let storage = {
  45. set: (key, value) => {
  46. if (typeof value == 'object') {
  47. window.localStorage.setItem(key, JSON.stringify(value));
  48. } else {
  49. window.localStorage.setItem(key, value);
  50. }
  51. },
  52. get: (key) => {
  53. var result = window.localStorage.getItem(key);
  54. if (Global.isJsonFormat(result)) {
  55. return JSON.parse(result);
  56. } else {
  57. return result;
  58. }
  59. },
  60. remove: (key) => {
  61. window.localStorage.removeItem(key);
  62. },
  63. clean: (key) => {
  64. window.localStorage.clear();
  65. }
  66. }
  67. /*
  68. * @axiosMessage
  69. * 封装axios请求消息提示
  70. * type: 提示类型|msg: 提示消息|callBack: 消息关闭时的回调函数|settings: 其他配置项
  71. */
  72. let axiosMessage = (type, msg, callBack, settings) => {
  73. let defaultSettings = {
  74. type: type,
  75. message: msg,
  76. duration: 2000,
  77. showClose: true,
  78. onClose: callBack ? callBack : null
  79. };
  80. if (settings && typeof settings == 'object') {
  81. for (let p in settings) {
  82. defaultSettings[p] = settings[p];
  83. }
  84. }
  85. Message(defaultSettings);
  86. }
  87. /*
  88. * @publicAxiosRequest
  89. * 封装公用的axios请求处理方法
  90. * params: 请求参数|axiosFunc: axios请求|callBack: 请求成功执行的回调函数|closeLoading: 是否开启Loading效果
  91. */
  92. let publicAxiosRequest = (params, axiosFunc, callBack, closeLoading) => {
  93. Global.isLoadingOpened = typeof closeLoading == 'undefined' ? true : closeLoading;
  94. axiosFunc(params).then((res) => {
  95. let { code, data, message } = res;
  96. if (code >= 200 && code < 300) {
  97. callBack(data, message);
  98. } else {
  99. let requestMsg = '';
  100. if (typeof message == 'object') {
  101. for (let key in message) {
  102. requestMsg += message[key].join('、');
  103. }
  104. } else {
  105. requestMsg = message;
  106. }
  107. Global.axiosMessage('error', requestMsg, Global.endLoading);
  108. }
  109. }).catch((e) => {
  110. Global.endLoading();
  111. console.info(e);
  112. });
  113. }
  114. // 记录响应错误提示次数
  115. let errorCount = 0
  116. /*
  117. * axios请求拦截
  118. */
  119. axios.interceptors.request.use(
  120. config => {
  121. // 添加取消请求
  122. config.cancelToken = new axios.CancelToken(cancel => {
  123. store.commit('PUSH_TOKEN', { cancelToken: cancel });
  124. });
  125. // 判断是否开启Loading效果
  126. if (Global.isLoadingOpened) {
  127. Global.startLoading();
  128. }
  129. // 配置token信息
  130. if (Global.storage.get('requestToken')) {
  131. config.headers.Authorization = 'Bearer ' + Global.storage.get('requestToken');
  132. }
  133. return config;
  134. },
  135. error => {
  136. return Promise.reject(error);
  137. }
  138. )
  139. /*
  140. * axios响应拦截
  141. */
  142. axios.interceptors.response.use(
  143. response => {
  144. // 请求成功之后必须恢复isLoadingOpened为true
  145. if (!Global.isLoadingOpened) {
  146. Global.isLoadingOpened = true;
  147. }
  148. // 请求成功之后必须恢复isLoadingClosed为true
  149. if (!Global.isLoadingClosed) {
  150. Global.isLoadingClosed = true;
  151. }
  152. if (Global.isLoadingClosed) {
  153. setTimeout(() => {
  154. Global.endLoading();
  155. }, 200);
  156. }
  157. return response;
  158. },
  159. error => {
  160. // 判断是否是被取消请求的响应错误
  161. if (axios.isCancel(error)) {
  162. // 中断promise链接
  163. return new Promise(() => {
  164. // 判断是否有Loading加载效果没有关闭
  165. if (Global.requestLoading) {
  166. setTimeout(() => {
  167. Global.endLoading();
  168. }, 200);
  169. }
  170. });
  171. } else {
  172. if (error.response && error.response.status) {
  173. errorCount++;
  174. let msg = '';
  175. switch (error.response.status) {
  176. case 404: // 请求不存在
  177. msg = '请求不存在,请重新登录';
  178. break;
  179. case 417: // 没有操作权限
  180. msg = '没有操作权限,请联系管理员设置';
  181. break;
  182. case 500: // 服务器异常
  183. msg = '服务器异常,请稍后操作';
  184. break;
  185. default: // 其他错误
  186. msg = error.response.data.message;
  187. }
  188. // 多个错误提示时只弹出一个提示框
  189. if (errorCount < 2) {
  190. Global.confirmBox('warning', msg, '提示', () => {
  191. Global.session.clean();
  192. Global.storage.clean();
  193. window.location.href = window.location.origin + '/#/';
  194. });
  195. }
  196. return Promise.reject(error.response);
  197. }
  198. }
  199. }
  200. )
  201. // 初始化signalr
  202. export const initSignalr = (func1) => {
  203. const signalrAddress = process.env.VUE_APP_API_URL,
  204. AccessToken = Global.storage.get('requestToken'),
  205. TenantId = Global.storage.get('companyId') ? Global.storage.get('companyId') : '';
  206. let connection = new signalR.HubConnectionBuilder()
  207. .withUrl(signalrAddress + '/hubs/chathub?access_token=' + AccessToken + '&TenantId=' + TenantId) // signalr连接地址
  208. .withAutomaticReconnect({ nextRetryDelayInMilliseconds: () => 50000 }) // 断开自动重连
  209. .build();
  210. // 监听断开重连
  211. connection.onreconnected(connectionId => {
  212. console.log('重新连接成功', connectionId);
  213. });
  214. // 监听连接关闭
  215. connection.onclose(err => {
  216. console.log('连接关闭', err);
  217. });
  218. // 注册后端调用的方法(接收数据)
  219. connection.on('ReceiveMessage', func1);
  220. // 开始连接
  221. connection.start()
  222. .then(res => {
  223. console.info('%c连接成功', 'color: #03d903');
  224. })
  225. .catch(err => {
  226. console.info('%c连接失败', 'color: #ff0000');
  227. });
  228. return connection;
  229. }
  230. // 推送数据给后端
  231. export const sendMessage = (signalr, data) => {
  232. if (signalr) {
  233. signalr.send('SendMessage', data)
  234. .then(res => {
  235. console.log('推送成功', res);
  236. });
  237. }
  238. }
  239. // 关闭signalr
  240. export const closeSignalr = (signalr) => {
  241. if (signalr) {
  242. signalr.stop();
  243. signalr = null;
  244. }
  245. }
  246. // 【登录】获取token信息
  247. export const userLogin = (params) => { return axios.post(`${REQUEST_URL}/api/login`, params).then(res => res.data) }
  248. export default axios
  249. const Global = {
  250. baseURl,
  251. session,
  252. storage,
  253. axiosMessage,
  254. publicAxiosRequest
  255. }
  256. export default Global

参见:

axios - npm

Axios中文文档 | Axios中文网

@microsoft/signalr - npm

SignalR 简介 | Microsoft Learn

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号