前语

上一篇文章,分享了一个根据http封装的一个网络库,里边有一个知识点,在初始化的时候,能够设置恳求头阻拦和恳求过错后的信息的阻拦,详细事例如下:

Net.getInstance().init({
  netErrorInterceptor: new MyNetErrorInterceptor(), //设置大局过错阻拦,需求自行创立,可在这儿进行过错处理
  netHeaderInterceptor: new MyNetHeaderInterceptor(), //设置大局头阻拦器,需求自行创立
})

当恳求产生过错时,就会把过错信息回传至自定义的netErrorInterceptor里,相同的,当建议一次恳求时,假如有恳求头阻拦,会先履行netHeaderInterceptor,把头参数传递,再履行request,恳求模式如下:

HarmonyOS开发:回调完成网络的阻拦

咱们需求知道的是,在鸿蒙开发中,不像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.netErrorInterceptor
    this.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));
    }
});

可是,有一种状况破例,那便是,假如你的恳求头回调目标里,有耗时操作,比方签名加密等等,此刻在订阅里进行回调,会产生,现已建议恳求了,可是恳求头参数未添加的状况,也便是恳求不同步问题,所以,这种状况下,有必要要等到恳求头参数履行结束后再建议恳求,就不能再订阅里进行设置。