HarmonyOS鴻蒙應用開發——HTTP網絡訪問與封裝

文章目錄

    • 基本使用
    • 封裝
    • 參考

基本使用

鴻蒙應用發起HTTP請求的基本使用,如下:

  • 導入http模塊
  • 創建httpRequest對象
  • 發起http請求,并處理響應結果

第一、導入http模塊:

import http from '@ohos.net.http'

第二、創建httpRequest對象,注意的是每一個httpRequest對象對應一個http請求任務,不可復用。

 const httpRequest = http.createHttp()

第三、發起請求,比如POST請求

 httpRequest.request(// 請求url地址url,{// 請求方式method: http.RequestMethod.POST,// 請求的額外數據。extraData: {"param1": "value1","param2": "value2",},// 可選,默認為60sconnectTimeout: 60000,// 可選,默認為60sreadTimeout: 60000,// 開發者根據自身業務需要添加header字段header: {'Content-Type': 'application/json'}}).then((data) => { if (data.responseCode === http.ResponseCode.OK) {// 處理響應結果// data.result為服務器返回的業務數據console.info('Result:' + data.result);console.info('code:' + data.responseCode);}
}).catch((err) => {console.info('error:' + JSON.stringify(err));
});

最后需要聲明網絡權限,在module.josn5文件中聲明:

{"module" : {"requestPermissions":[{"name": "ohos.permission.INTERNET"}]}
}

上面就是網絡請求的簡單使用,接下來通過Promise來封裝一個網絡請求庫,統一管理請求參數、響應數據、日志的輸出等,對外屏蔽了細節,使用者只需定義業務數據的實體類以及調用即可。

封裝

以**玩Android**開放接口為測試用例

定義業務數據的實體類,通過泛型來接收不同的數據類型:

export class ResponseResult<T> {errorCode: number;errorMsg: string;data?: T | Object | string;
}

把各種請求方式用枚舉聲明RequestMethod

export enum RequestMethod {OPTIONS,GET,HEAD,POST ,PUT,DELETE,TRACE,CONNECT
}

其實在http模塊中已經有對應的枚舉,之所以再用一個新枚舉來聲明,是簡化使用,同時也是將http模塊相關細節屏蔽掉不對外開放,這樣可以靈活替換網絡庫。

定義一個HttpUtils類實現:

const  TAG = "HttpUtils"
const BASE_URL = "https://www.wanandroid.com"
export class HttpUtils{public static readonly SUCCESS_CODE: number = 0public static readonly READ_TIME_OUT = 60 * 1000public static readonly CONNECT_TIME_OUT = 60 * 1000private baseUrl: string = ""constructor(baseUrl: string) {this.baseUrl = baseUrl}private methodName(method: RequestMethod): http.RequestMethod {switch (method){case RequestMethod.OPTIONS:{return http.RequestMethod.OPTIONS}case RequestMethod.GET:{return http.RequestMethod.GET}case RequestMethod.HEAD:{return http.RequestMethod.HEAD}case RequestMethod.POST:{return http.RequestMethod.POST}case RequestMethod.PUT:{return http.RequestMethod.PUT}case RequestMethod.DELETE:{return http.RequestMethod.DELETE}case RequestMethod.TRACE:{return http.RequestMethod.TRACE}case RequestMethod.CONNECT:{return http.RequestMethod.CONNECT}}}request<T>(path: string, reqMethod: RequestMethod, parameter: Map<string, Object> = null): Promise<T | null> {// 注意的是每一個httpRequest對象對應一個http請求任務,不可復用。const httpRequest = http.createHttp()const method = this.methodName(reqMethod)let extraData = {}let url = `${this.baseUrl}/${path}`if (parameter != null) {switch (reqMethod) {case RequestMethod.POST: {extraData = Object.fromEntries(parameter)break;}case RequestMethod.GET: {const urlParams = Object.keys(parameter).map(key => `${key}=${parameter[key]}`).join('&')if (url.includes("?")) {url = `${url}${urlParams}`} else {url = `${url}?${urlParams}`}break;}}}LogUtils.debug(TAG, "==================Request====================")LogUtils.debug(TAG, "url: " + url)LogUtils.debug(TAG, "method: " + method.toString())if (reqMethod == RequestMethod.POST)LogUtils.debug(TAG, "extraData: " + JSON.stringify(parameter, null, 2))return new Promise((resolve, reject) => {httpRequest.request(url,{method,readTimeout: HttpUtils.READ_TIME_OUT,connectTimeout: HttpUtils.CONNECT_TIME_OUT,header: {'Content-Type': 'application/json'},extraData}).then((value) => {LogUtils.debug(TAG, "==================Response====================")LogUtils.debug(TAG, "url: " + url)LogUtils.debug(TAG, "method: " + method.toString())LogUtils.debug(TAG, "header: " + JSON.stringify(value.header, null, 2))LogUtils.debug(TAG, "responseCode: " + value.responseCode)LogUtils.debug(TAG, "resultType: " + value.resultType)if (value.responseCode == http.ResponseCode.OK) {let result: ResponseResult<T> = JSON.parse(value.result.toString())LogUtils.debug(TAG, "body: " + JSON.stringify(result, null, 2))if (result.errorCode == HttpUtils.SUCCESS_CODE) {resolve(result.data as T)} else {reject(result.errorMsg)}} else {reject("請求失敗")}}).catch((reason) => {reject(reason)})})}get<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {return this.request<T>(path, RequestMethod.GET, parameter)}post<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {return this.request<T>(path, RequestMethod.POST, parameter)}delete<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {return this.request<T>(path, RequestMethod.DELETE, parameter)}put<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {return this.request<T>(path, RequestMethod.PUT, parameter)}}
const YiNet = new HttpUtils(BASE_URL)
export default YiNet

使用發起網絡請求:

  aboutToAppear() {let map = new Map<string,string>()map["cid"] = 294YiNet.get<ArticleList>("project/list/1/json",map).then((data)=>{this.data = JSON.stringify(data, null, 2)})let map2 = new Map<string,string>()map2["username"] = "123"map2["password"] = "123456"YiNet.post<User>("user/login",map2).then((data)=>{this.data = JSON.stringify(data, null, 2)}).catch((err)=>{Prompt.showToast({message:err})})}

日志輸出:

在這里插入圖片描述

參考

  • https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667364948559963?ha_linker=eyJ0cyI6MTcwMjE3NzI3OTYyMywiaWQiOiI4MmM3ZTI1MmFmMDJlMDZiODBmOGU1ZDM5ZTI5YmMyOCJ9
  • https://www.wanandroid.com/blog/show/2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212765.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二分查找|滑動窗口|前綴和|LeetCode209: 長度最小的子數組

長度最短的子數組 作者推薦 【動態規劃】【廣度優先】LeetCode2258:逃離火災 本文涉及的基礎知識點 二分查找算法合集 C算法&#xff1a;前綴和、前綴乘積、前綴異或的原理、源碼及測試用例 包括課程視頻 滑動窗口 題目 給定一個含有 n 個正整數的數組和一個正整數 target…

facebook回傳

1、引入依賴 首先引入依賴&#xff0c;這里我使用API v14.0&#xff1a; <dependency><groupId>com.facebook.business.sdk</groupId><artifactId>facebook-java-business-sdk</artifactId><version>14.0.0</version></dependen…

在IDEA中創建Maven項目時沒有src文件、不自動配置文件

錯誤示例&#xff1a; 沒有src文件&#xff0c;并且沒有自動下載相關的配置文件 對我這中情況無效的解決辦法&#xff1a; ①配置好下列圖中圈出來的文件 ②在VM選項中輸入&#xff1a;“-DarchetypeInternal” ③點擊應用&#xff0c;再點擊確定 ④還是不行 解決辦法&#x…

GridBagLayout GridBagConstraints 筆記231130

實例化使用模板 GridBagLayout gbl new GridBagLayout(); // gbl.columnWidths new int[]{200,200,200}; // 用數組設置列 // gbl.rowHeights new int[]{100,100,100,100,100}; // 用數組設置行GridBagConstraints gbc new GridBagConstraints();/*** gridBagConstrain…

14-1、IO流

14-1、IO流 lO流打開和關閉lO流打開模式lO流對象的狀態 非格式化IO二進制IO讀取二進制數據獲取讀長度寫入二進制數據 讀寫指針 和 隨機訪問設置讀/寫指針位置獲取讀/寫指針位置 字符串流 lO流打開和關閉 通過構造函數打開I/O流 其中filename表示文件路徑&#xff0c;mode表示打…

用Guava做本地緩存示例

緩存的作用 提升系統性能&#xff0c;暫時在內存中保存業務系統的數據處理結果&#xff0c;并且等待下次訪問使用 本地緩存和分布式緩存 緩存分為本地緩存與分布式緩存。本地緩存為了保證線程安全問題&#xff0c;一般使用ConcurrentMap的方式保存在內存之中&#xff0c;而常…

【KCC@南京】KCC南京“數字經濟-開源行”活動回顧錄

11月26日&#xff0c;由KCC南京、中科南京軟件研究所、傲空間、PowerData聯合主辦的 KCC南京“數字經濟-開源行” 的活動已圓滿結束。此次活動&#xff0c;3 場主題研討&#xff0c;11 場分享&#xff0c;現場參會人數 60&#xff0c;線上直播觀看 3000&#xff0c;各地小伙伴從…

Android畫布Canvas繪圖scale,Kotlin

Android畫布Canvas繪圖scale&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…

數據倉庫工具Hive

1. 請解釋Hive是什么&#xff0c;它的主要用途是什么&#xff1f; Hive是一個基于Hadoop的數據倉庫工具&#xff0c;主要用于處理和分析大規模結構化數據。它可以將結構化的數據文件映射為一張數據庫表&#xff0c;并提供類似SQL的查詢功能&#xff0c;將SQL語句轉換為MapRedu…

Windows 和 MacOS 上安裝配置ADB(安卓調試橋)

一、Android 調試橋 (ADB) Android 調試橋&#xff08;ADB&#xff09; 是一款多功能命令行工具&#xff0c;它讓你能夠更便捷地訪問和管理 Android 設備。使用 ADB 命令&#xff0c;你可以輕松執行以下操作 在設備上安裝、復制和刪除文件&#xff1b;安裝應用程序&#xff1…

YOLOV3 SPP 目標檢測項目(針對xml或者yolo標注的自定義數據集)

1. 目標檢測的兩種標注形式 項目下載地址:YOLOV3 SPP網絡對自定義數據集的目標檢測(標注方式包括xml或者yolo格式) 目標檢測邊界框的表現形式有兩種: YOLO(txt) : 第一個為類別,后面四個為邊界框,x,y中心點坐標以及h,w的相對值 xml文件:類似于網頁的標注文件,里面會…

力扣第 375 場周賽(Java)

文章目錄 T1 統計已測試設備代碼解釋 T2 雙模冪運算代碼解釋 T3 統計最大元素出現至少 K 次的子數組代碼解釋 T4 統計好分割方案的數目代碼解釋 鏈接&#xff1a;第 375 場周賽 - 力扣&#xff08;LeetCode&#xff09; T1 統計已測試設備 給你一個長度為 n 、下標從 0 開始的…

JavaEE 08 線程池簡介

前言 前面我們談完了定時器,單例模式,阻塞隊列等的操作并且做了模擬實現,今天我們再來說一說線程池的操作以及一些鎖策略. 注:本章幾乎均為理論篇,實踐較少. 下面就讓我們開始吧. 線程池 我們知道因為進程的頻繁創建和銷毀,帶來的開銷過大,我們無法接受,所以我們引入了更輕量級…

Linux常見壓縮指令小結

為什么需要壓縮技術 我們都知道文件是以byte作為單位的&#xff0c;如果我們的文件僅僅在低位占一個1 0000 0001這種情況我們完全可以壓縮一下&#xff0c;將高位的0全部抹掉即可。 如上所說是一種壓縮技術&#xff0c;還有一種就是將1111(此處省略96個)一共100個1&#xff0…

mysql執行帶函數命令的sql腳本報錯

一、前言 開發給了一個帶函數的sql文件讓我執行&#xff0c;但是執行導入時報以下錯誤 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled 二、解決 在數據庫命令行中執行以下命令&#xff08;臨時生效&…

HarmonyOS4.0從零開始的開發教程11給您的應用添加彈窗

HarmonyOS&#xff08;十&#xff09;給您的應用添加彈窗 概述 在我們日常使用應用的時候&#xff0c;可能會進行一些敏感的操作&#xff0c;比如刪除聯系人&#xff0c;這時候我們給應用添加彈窗來提示用戶是否需要執行該操作&#xff0c;如下圖所示&#xff1a; 彈窗是一種…

AI:99-基于深度學習的飛機故障檢測與維修

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

【pycharm】Pycharm中進行Git版本控制

本篇文章主要記錄一下自己在pycharm上使用git的操作&#xff0c;一個新項目如何使用git進行版本控制。 文章使用的pycharm版本PyCharm Community Edition 2017.2.4&#xff0c;遠程倉庫為https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Gitee創建…

記錄一次云原生線上服務數據遷移全過程

文章目錄 背景遷移方案調研遷移過程服務監控腳本定時任務暫停本地副本服務啟動&#xff0c;在線服務下線MySQL 數據遷移Mongo 數據遷移切換新數據庫 ip 本地服務啟動數據庫連接驗證服務打包部署服務重啟前端恢復正常監控腳本定時任務啟動舊服務器器容器關閉 遷移總結 背景 校園…

正確使用React組件緩存

簡介 正常來講的話當我們點擊組件的時候&#xff0c;該組件以及該組件的子組件都會重新渲染&#xff0c;但是如何避免子組件重新渲染呢&#xff0c;我們經常用memo來解決 React.memo配合useCallback緩存組件 父組件沒有傳props const Index ()> {console.log(子組件刷新…