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.pswp.cn/news/215356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215356.shtml
英文地址,請注明出處:http://en.pswp.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…