HarmonyOS开发:回调实现网络的拦截

前言

基于http封装的一个网络库,里面有一个知识点,在初始化的时候,可以设置请求头拦截和请求错误后的信息的拦截,具体案例如下:

et.getInstance().init({netErrorInterceptor: new MyNetErrorInterceptor(), //设置全局错误拦截,需要自行创建,可在这里进行错误处理netHeaderInterceptor: new MyNetHeaderInterceptor(), //设置全局头拦截器,需要自行创建})

当请求发生错误时,就会把错误信息回传至自定义的netErrorInterceptor里,同样的,当发起一次请求时,如果有请求头拦截,会先执行netHeaderInterceptor,把头参数传递,再执行request,请求模式如下:

我们需要知道的是,在鸿蒙开发中,不像Android中的okhttp,为我们提供了一定的拦截器,鸿蒙中的http这个系统的Api没有提供任何的拦截器概念的,这就导致了,我们如果想要实现统一的请求头拦截,或者统一的错误处理,就需要自己定义了。

如何实现呢,和上述中的流程图一样,进行回调处理。

初始化传入

我们可以通过全局初始化,进行设置对应的拦截,当然了不限于这两种拦截,MyNetErrorInterceptor是自定义的错误拦截对象,需要继承NetErrorInterceptor,MyNetHeaderInterceptor是自定义的请求头拦截器对象,继承于NetHeaderInterceptor

Net.getInstance().init({netErrorInterceptor: new MyNetErrorInterceptor(), //设置全局错误拦截,需要自行创建,可在这里进行错误处理netHeaderInterceptor: new MyNetHeaderInterceptor(), //设置全局头拦截器,需要自行创建})

需要注意的是,在同模块下,我们可以使用接口创建我们的拦截对象,如果你想要打har包,或者不同的模块,使用接口导出export是有问题的,如何解决呢,使用抽象类作为拦截对象,代码如下:

MyNetErrorInterceptor继承的NetErrorInterceptor对象:

import { NetError } from '../error/NetError';/*** AUTHOR:AbnerMing* DATE:2023/9/12* INTRODUCE:全局异常拦截* */
export abstract class NetErrorInterceptor {abstract httpError(error: NetError)
}

MyNetHeaderInterceptor继承的NetHeaderInterceptor对象:

import { HttpHeaderOptions } from '../model/HttpHeaderOptions';/*** AUTHOR:AbnerMing* DATE:2023/9/13* INTRODUCE:全局头参数拦截* */export abstract class NetHeaderInterceptor {abstract getHeader(options: HttpHeaderOptions): Promise<Object>
}

工具类接收

全局初始化设置以后,那么在Net工具类中,我们就需要接收了,接收赋值给成员变量之后,再通过方法进行暴露,方便后续的调用。

private mNetErrorInterceptor: NetErrorInterceptor //全局错误拦截
private mNetHeaderInterceptor: NetHeaderInterceptor //全局头拦截器/** Author:AbnerMing* Describe:初始化*/init(options: NetOptions) {this.mNetErrorInterceptor = options.netErrorInterceptorthis.mNetHeaderInterceptor = options.netHeaderInterceptor}/** Author:AbnerMing* Describe:获取全局错误拦截*/getNetError(): NetErrorInterceptor {return this.mNetErrorInterceptor}/** Author:AbnerMing* Describe:获取全局头拦截器*/getNetHeaderInterceptor(): NetHeaderInterceptor {return this.mNetHeaderInterceptor}

进行使用

前两步,把动作已经实现,如何触发这个动作,那么就需要调用了,也就是进行实现方法的调用,进行数据的回调,通过getNetError或者getNetHeaderInterceptor,拿到设置的对象,进行非空判断之后,调用对象里的函数即可。

1、请求头拦截调用

注意:这个拦截是在发起请求request之前进行设置,如果拦截,必须等待头参数执行完毕。

if (Net.getInstance().getNetHeaderInterceptor() != null) {//需要拦截头参数了Net.getInstance().getNetHeaderInterceptor().getHeader({url: this.getUrl(),method: this.getMethod(),params: this.getParams(),header: this.getHeaders()}).then((header) => {//发起请求this.setHeaders(header)this.doRequest(httpRequest,success, error,isReturnString, isReturnData)}).catch(() => {//发起请求this.doRequest(httpRequest,success, error,isReturnString, isReturnData)})}

2、错误拦截调用

当请求发生错误进行回调。

      //全局回调错误信息if (Net.getInstance().getNetError() != null) {Net.getInstance().getNetError().httpError(new NetError(err.code, NetError.responseError(err.code)))}

信息回传

如何拿到回传数据?在第一步中的初始化设置中我们已经传入了,在实现方法里获取即可。

1、请求头拦截对象

import { HttpHeaderOptions, NetHeaderInterceptor } from '@app/net'class MyNetHeaderInterceptor implements NetHeaderInterceptor {getHeader(options: HttpHeaderOptions): Promise<Object> {//进行签名加密,设置请求头等操作return null}
}

2、请求错误拦截对象

import { NetError } from '@app/net/src/main/ets/error/NetError';
import { INetErrorInterceptor } from '@app/net/src/main/ets/interceptor/INetErrorInterceptor';export class MyNetErrorInterceptor implements INetErrorInterceptor {httpError(error: NetError) {//这里进行拦截错误信息}
}

相关总结

有的老铁可能会发出灵魂的拷问,为什么要在请求前进行回调,http不是提供了订阅Header 事件吗,可以在这里进行回调啊,确实,在发起请求之前,可以通过如下的代码进行请求头参数的订阅,拿到请求头参数的一些信息,同样的也可以进行请求头回调,也就是拦截。

httpRequest.on('headerReceive', (err, data) => {if (!err) {console.info('header: ' + JSON.stringify(data));} else {console.info('error:' + JSON.stringify(err));}
});

但是,有一种情况例外,那就是,如果你的请求头回调对象里,有耗时操作,比如签名加密等等,此时在订阅里进行回调,会发生,已经发起请求了,但是请求头参数未添加的情况,也就是请求不同步问题,所以,这种情况下,必须要等到请求头参数执行完毕后再发起请求,就不能再订阅里进行设置。

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

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

相关文章

web网络安全

web安全 一&#xff0c;xss 跨站脚本攻击(全称Cross Site Scripting,为和CSS&#xff08;层叠样式表&#xff09;区分&#xff0c;简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码&#xff08;也可能包含html代码&#xff09;&#xff0c;当用户浏览网页之时&…

关于北京医学sci论文翻译

在医学领域&#xff0c;翻译论文是一项非常重要的工作。医学论文的翻译需要准确、专业、严谨&#xff0c;同时也需要考虑到医学领域的特殊性和复杂性。那么&#xff0c;如何翻译医学论文呢&#xff1f;北京医学SCI论文翻译哪家好呢&#xff1f; 首先&#xff0c;需要具备专业的…

多目标跟踪数据集

目录 DanceTrack数据集 自己改进的可视化代码: DanceTrack数据集 DanceTrack 是一个大规模的多对象跟踪数据集。用于在遮挡、频繁交叉、同样服装和多样化身体姿态条件下对人进行跟踪。强调运动分析在多对象跟踪中的重要性。 GitHub地址:https://github.com/DanceTrack/Dan…

python自动化测试实战 —— 单元测试框架

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

swing快速入门(五)

注释很详细&#xff0c;直接上代码 上一篇 本篇新增内容&#xff1a; 1.布局管理器BorderLayout 2.自适应尺寸方法pack() import java.awt.*; public class swing_test_3 {public static void main(String[] args) {Frame framenew Frame("演示BorderLayout");//…

第十六届山东省职业院校技能大赛高职组“应用软件系统开发”赛项样题

第十六届山东省职业院校技能大赛 高职组“应用软件系统开发”赛项样题 目录 一&#xff0e;竞赛须知 二&#xff0e;竞赛任务标题二 模块一&#xff1a;系统需求分析&#xff08;25分&#xff09; 模块二&#xff1a;软件系统开发&#xff08;55分&#xff09; 模块三&am…

【APP安卓测试工具】adb(Android Debug Bridge)

1.常见的命令 列出已连接的设备 adb device安装 adb install <APK文件路径>卸载 adb uninstall <APK文件路径>启动和停止 adb shell am start -n <包名>[/<Activity>]adb shell am force -stop <包名>截屏和录屏 adb shell screencap <文件路…

cordic 算法学习记录

参考&#xff1a;b站教学视频FPGA&#xff1a;Cordic算法介绍与实现_哔哩哔哩_bilibili FPGA硬件实现加减法、移位等操作比较简单&#xff0c;但是实现乘除以及函数计算复杂度高且占用资源多&#xff0c;常见的计算三角函数/平方根的求解方式有①查找表&#xff1a;先把函数对应…

JVM面试连环炮:你准备好迎接挑战了吗?

在Java开发领域&#xff0c;JVM面试一直是一个热门话题。作为一名优秀的开发者&#xff0c;你是否已经准备好迎接这场挑战了呢&#xff1f;今天&#xff0c;我们就来深度解析一下JVM面试的热点问题&#xff0c;帮助你更好地应对面试&#xff0c;一举拿下offer&#xff01; 1、…

Python 使用sphinx生成API文档

目录 前言: 项目层级 Python项目docstring规范 Example Google Style Python Docstrings Example NumPy Style Python Docstrings reStructuredText Style 设置代码docstrings风格(pycharm) 安装sphinx 创建sphinx文档项目 配置conf.py文件 编译代码为api文档 编译…

vim + ctags 跳转, 查看函数定义

yum install ctags Package ctags-5.8-13.el7.x86_64 already installed and latest version 创建 /home/mzh/pptp-master/tags.sh #!/usr/bin/shWORKDIR/home/mzh/pptp-masterfind ${WORKDIR} -name "*.[c|h]" | xargs ctags -f ${WORKDIR}/tags find /usr/inclu…

final的安全发布

final的安全发布 两个关键字“发布”“安全” 所谓发布通俗一点的理解就是创建一个对象&#xff0c;使这个对象能被当前范围之外的代码所使用 比如Object o new Object(); 然后接下来使用对象o 但是对于普通变量的创建&#xff0c;之前分析过&#xff0c;大致分为三个步骤&am…

k8s之身份认证与权限

Kubernetes 中提供了良好的多租户认证管理机制&#xff0c;如 RBAC、ServiceAccount 还有各种策略等。 通过该文件可以看到已经配置了 RBAC 访问控制 /usr/lib/systemd/system/kube-apiserver.service 1.1 认证 所有 Kubernetes 集群有两类用户&#xff1a;由 Kubernetes 管理的…

mysql数据库学习笔记(1)

今天开始学mysql数据库&#xff0c;为什么要学这个呢&#xff0c;因为数据库可结构化存储大量的数据信息&#xff0c;方便用户进行有效的检索和访问。数据库可有效地保持数据信息的一致性、完整性、降低数据冗余。数据库可满足应用的共享和安全方面的要求&#xff0c;把数据放在…

java--认识异常、自定义异常

1.异常体系 Error&#xff1a;代表的系统级别错误(属于严重问题)&#xff0c;也就是说系统一旦出现问题&#xff0c;sun公司会把这些问题封装成Error对象给出来&#xff0c;说白了&#xff0c;Error是给sun公司自己用的&#xff0c;不是给我们程序员用的&#xff0c;因此我们开…

MacOS下homebrew的安装与使用

安装Homebrew //删除原来的文件&#xff0c;可以在删除前查看下Cellar文件夹下已安装的包,homebrew将工具安装在这个文件夹下&#xff0c;并在/usr/local/bin下建立连接 sudo -irm -rf /usr/local/Cellar /usr/local/.gi sudo chown -R liudong /usr/local //更新文件属主为liu…

114. 二叉树展开为链表 --力扣 --JAVA

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 解题思路 …

通过Ai帮我们写前端界面设计

现在我要写一个前端界面&#xff0c;from表单&#xff0c;让用户登录使用的&#xff0c;提交表单之前先分析用户名和密码是否填的完成&#xff0c;并且检查密码必须满足 包含大小写&#xff0c;数字&#xff0c;密码长度必须在8到20之间&#xff0c;不满足不可以提交。用户名必…

ethtool

ethtool ethtool是一个常用的命令行工具&#xff0c;用于配置和查询以太网接口的驱动程序和硬件参数。它提供了一种简单的方式来检查和修改网络接口的设置&#xff0c;以及获取与以太网接口相关的统计数据和状态信息。 ethtool可以执行以下常见的操作&#xff1a; 查询接口信息…

【Hadoop】修改YARN配置文件

本节需要修改的 YARN 配置文件保存在$HADOOP_HOME/etc/haoop 目录下&#xff0c;需要修改的文件共有 7 个&#xff0c;分别是&#xff1a;core-site.xml, hadoop-env.sh, hdfs-site.xml, yarn-site.xml, yarn-env.sh, mapred-site.xml, slave. 这些文件的用途&#xff1a; core…