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");//…

cordic 算法学习记录

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

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

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

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…

mysql数据库学习笔记(1)

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

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

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

大数据技术2:大数据处理流程

前言&#xff1a;下图是一个简化的大数据处理流程图&#xff0c;大数据处理的主要流程包括数据收集、数据存储、数据处理、数据应用等主要环节。 1.1 数据收集 大数据处理的第一步是数据的收集。现在的中大型项目通常采用微服务架构进行分布式部署&#xff0c;所以数据的采集需…

MySQL慢SQL优化思路

MySQL慢SQL优化思路 具体思路&#xff1a; 1、慢查询日志记录慢 SQL 2、explain 分析 SQL 的执行计划 3、profile 分析执行耗时 4、Optimizer Trace 分析详情 5、确定问题并采用相应的措施 1、查看慢日志 1.1 使用命令查询慢日志配置 mysql> show variables like s…

mysql 5.7.34升级到5.7.44修补漏洞

mysql 5.7.34旧版本&#xff0c;漏扫有漏洞&#xff0c;升级到最新版本 旧版本5.7.34在 /home/mysql/mysql中安装 备份旧版本数据还有目录 数据库备份升级 tar -xf mysql-5.7.44-el7-x86_64.tar #覆盖旧版本数据库文件 #注意看看文件是否和你起服务的用户一样 \cp -r mysql-5…

decomposition-based multi-objective algorithm4SPDPTW

关键词 文章概述 研究背景 多目标选择性接送和配送问题&#xff08;PDPs&#xff09;&#xff1a;研究涉及多目标选择性接送和配送问题&#xff0c;这些问题传统上从单一目标角度进行探讨&#xff0c;以寻找最具盈利性的请求集合&#xff0c;同时遵守一系列限制条件。 经济和…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(五)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境微信开发者工具OneNET云平台 模块实现1. 数据预处理2. 创建模型并编译3. 模型训练及保存4. 上传结果5. 小程序开发1&#xff09;查询图片2&#xff09;查询识别结…

【收获】成长之路

目录 一、前言二、计算机方面三、专业知识方面四、总结 一、前言 四年&#xff0c;对于一个人的成长来说&#xff0c;是一个相当重要的阶段。在这段时间里&#xff0c;我经历了许多挑战、收获了许多成就&#xff0c;也在不断地成长和改变。回首这四年的点点滴滴&#xff0c;我深…

安装LLaMA-Factory微调chatglm3,修改自我认知

安装git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda activate llama_factory cd LLaMA-Factory pip install -r requirements.txt 之后运行 CUDA_VISIBLE_DEVICES0 python src/train_web.py&#xff0c;按如下配置…

市场全局复盘 20231211

昨日回顾&#xff1a; SELECT TOP 10000 CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,所属行业,主力净额,DDE大单净量,CONVERT(DATETIME, 最后涨停时间, 120) AS 最后涨停时间 FROM dbo.全部&#xff21;股20231208_ALL WHERE 连板天 > 1AND DDE大单净量 > …

什么是零拷贝

什么是零拷贝&#xff1f; 快速理解 快速理解 要想理解零拷贝&#xff0c;首先要了解操作系统的IO流程&#xff0c;因为有内核态和用户态的区别&#xff0c;为了保证安全性和缓存&#xff0c;普通的读写流程如下&#xff1a; (对于Java程序而言&#xff0c;还会多了一个堆外内…

java的long类型超过9位报错:the literal 987654321000 of type int is out of range

java的long类型超过9位报错 1、报错提示2、报错截图3、解决办法4、参考文章 1、报错提示 the literal 987654321000 of type int is out of range 2、报错截图 3、解决办法 long类型是一种用于表示较大整数的数据类型&#xff0c;范围比int类型更广泛。然而&#xff0c;即使…