当前位置: 首页 > news >正文

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

前言

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

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

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

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

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

本篇的文章大致内容如下:

1、初始化传入

2、工具类接收

3、进行使用

4、信息回传

5、相关总结

初始化传入

我们可以通过全局初始化,进行设置对应的拦截,当然了不限于这两种拦截,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));}
});

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

相关文章:

  • Kotlin与Java写法的变更
  • 搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)
  • 合肥工业大学数据库实验报告
  • Ripro-V5 6.4最新版 不限域名无限搭建(授权激活文件)
  • springboot引入外部jar,package打包报错找不到程序包XXX
  • MySQL的表格去重,史上最简便的算法,一看就会
  • 汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)
  • 11.8知识总结(web应用程序、手写web框架、Django框架等)
  • 2023.11.09 homework
  • 2. Spark报错,Task is Failed,errorMsg: FileNotFoundException xxxx
  • uniapp刻度尺的实现(swiper)滑动打分器
  • 20 VPN详解
  • Flutter导入安卓第三方库报错:Flutter Could not find method implementation() 的可能原因及解决办法
  • QSqlDatabase使用Sqlite
  • 【c趣编程】输入一个整数,判断其有几位
  • python3.6+scrapy+mysql 爬虫实战
  • 0x05 Python数据分析,Anaconda八斩刀
  • 11111111
  • 2017届校招提前批面试回顾
  • 3.7、@ResponseBody 和 @RestController
  • go语言学习初探(一)
  • java中的hashCode
  • JS函数式编程 数组部分风格 ES6版
  • linux安装openssl、swoole等扩展的具体步骤
  • Mac转Windows的拯救指南
  • Mysql优化
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python_OOP
  • react-native 安卓真机环境搭建
  • RxJS: 简单入门
  • tweak 支持第三方库
  • 记一次和乔布斯合作最难忘的经历
  • 蓝海存储开关机注意事项总结
  • 一些css基础学习笔记
  • 阿里云移动端播放器高级功能介绍
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 数据库巡检项
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)构建dubbo分布式平台-平台功能导图
  • (十一)c52学习之旅-动态数码管
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)http协议
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET开发不可不知、不可不用的辅助类(一)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [100天算法】-x 的平方根(day 61)
  • [AIGC] Spring Interceptor 拦截器详解