HarmonyOs開發之———使用HTTP訪問網絡資源

?謝謝關注!!

前言:上一篇文章主要介紹HarmonyOs開發之———Video組件的使用:HarmonyOs開發之———Video組件的使用_華為 video標簽查看-CSDN博客

HarmonyOS 網絡開發入門:使用 HTTP 訪問網絡資源

HarmonyOS 作為新一代智能終端操作系統,提供了豐富的網絡 API 支持。本文將詳細介紹如何在 HarmonyOS 應用中使用 HTTP 協議訪問網絡資源,包含完整的開發流程和示例代碼。

一、網絡權限配置

在使用 HTTP 網絡請求前,需要在應用配置文件中聲明網絡訪問權限。打開項目中的config.json文件,添加以下權限聲明:

{"module": {"reqPermissions": [{"name": "ohos.permission.INTERNET","reason": "需要訪問網絡獲取數據","usedScene": {"ability": ["com.example.myapplication.MainAbility"],"when": "always"}}]}
}
二、使用 HttpURLConnection 進行 HTTP 請求

HarmonyOS 提供了標準 Java API 兼容的HttpURLConnection類,以下是使用該類進行 GET 和 POST 請求的示例:

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;
import ohos.eventhandler.InnerEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;public class NetworkAbility extends Ability {private static final int MSG_SUCCESS = 1;private static final int MSG_ERROR = 2;private EventHandler mainHandler;@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 創建主線程的EventHandler用于UI更新mainHandler = new EventHandler(EventRunner.getMainEventRunner()) {@Overrideprotected void processEvent(InnerEvent event) {super.processEvent(event);switch (event.eventId) {case MSG_SUCCESS:String result = (String) event.object;// 處理成功返回的數據break;case MSG_ERROR:String errorMsg = (String) event.object;// 處理錯誤信息break;}}};// 示例:發起GET請求getRequest("https://api.example.com/data");// 示例:發起POST請求Map<String, String> params = new HashMap<>();params.put("username", "test");params.put("password", "123456");postRequest("https://api.example.com/login", params);}/*** 發起GET請求*/private void getRequest(String urlStr) {new Thread(() -> {HttpURLConnection connection = null;BufferedReader reader = null;try {URL url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);connection.setReadTimeout(5000);int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}// 發送成功消息到主線程mainHandler.sendEvent(InnerEvent.get(MSG_SUCCESS, response.toString()));} else {mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "HTTP錯誤: " + responseCode));}} catch (Exception e) {mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "請求異常: " + e.getMessage()));} finally {// 關閉資源if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (connection != null) {connection.disconnect();}}}).start();}/*** 發起POST請求*/private void postRequest(String urlStr, Map<String, String> params) {new Thread(() -> {HttpURLConnection connection = null;OutputStream outputStream = null;BufferedReader reader = null;try {URL url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");connection.setConnectTimeout(5000);connection.setReadTimeout(5000);connection.setDoOutput(true);connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 構建POST參數StringBuilder postData = new StringBuilder();for (Map.Entry<String, String> param : params.entrySet()) {if (postData.length() != 0) postData.append('&');postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));postData.append('=');postData.append(URLEncoder.encode(param.getValue(), "UTF-8"));}byte[] postDataBytes = postData.toString().getBytes("UTF-8");// 寫入POST數據outputStream = connection.getOutputStream();outputStream.write(postDataBytes);int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}mainHandler.sendEvent(InnerEvent.get(MSG_SUCCESS, response.toString()));} else {mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "HTTP錯誤: " + responseCode));}} catch (Exception e) {mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "請求異常: " + e.getMessage()));} finally {// 關閉資源if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}if (connection != null) {connection.disconnect();}}}).start();}
}
三、網絡請求注意事項
  1. 線程管理:HarmonyOS 不允許在主線程中進行網絡操作,必須在子線程中執行網絡請求。示例中使用了 Thread+EventHandler 的方式,實際開發中也可以使用 AsyncTask 或線程池。
  2. 異常處理:網絡請求可能會因為各種原因失敗,如網絡中斷、服務器錯誤等,必須進行完善的異常處理。
  3. 數據解析:接收到的網絡數據通常需要解析,常見的格式有 JSON、XML 等。可以使用 GSON、FastJSON 等庫進行 JSON 數據解析。
  4. HTTPS 支持:如果需要訪問 HTTPS 資源,還需要處理 SSL 證書驗證等問題。
四、使用 OkHttp 庫簡化網絡請求

除了標準的 HttpURLConnection,也可以使用第三方庫 OkHttp 來簡化網絡請求。首先需要在build.gradle中添加依賴:

dependencies {implementation 'com.squareup.okhttp3:okhttp:4.9.1'}

以下是使用 OkHttp 的示例代碼:

// 在Ability中調用
public void fetchData() {OkHttpUtil.get("https://api.example.com/data", new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 處理失敗mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "請求失敗: " + e.getMessage()));}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String responseData = response.body().string();// 發送成功消息到主線程mainHandler.sendEvent(InnerEvent.get(MSG_SUCCESS, responseData));} else {mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "響應錯誤: " + response.code()));}}});
}

使用 OkHttp 發起請求的示例:

// 在Ability中調用
public void fetchData() {OkHttpUtil.get("https://api.example.com/data", new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 處理失敗mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "請求失敗: " + e.getMessage()));}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String responseData = response.body().string();// 發送成功消息到主線程mainHandler.sendEvent(InnerEvent.get(MSG_SUCCESS, responseData));} else {mainHandler.sendEvent(InnerEvent.get(MSG_ERROR, "響應錯誤: " + response.code()));}}});
}

五、總結

本文介紹了 HarmonyOS 中使用 HTTP 協議訪問網絡資源的基本方法,包括權限配置、使用 HttpURLConnection 和 OkHttp 進行網絡請求的實現。在實際開發中,建議根據項目需求選擇合適的網絡請求方式,并注意網絡請求的線程管理和異常處理,以提供穩定、流暢的用戶體驗。

近期因個人原因停更感到非常抱歉。之后會每周分享希望大家喜歡。

請注意,HarmonyOS的UI框架可能會隨著版本的更新而有所變化,因此為了獲取最新和最準確的屬性說明和用法,建議查閱HarmonyOS的官方文檔。

如需了解更多請聯系博主,本篇完。

下一篇:HarmonyOs開發之———UIAbility進階
HarmonyOs開發,學習專欄敬請試讀訂閱:https://blog.csdn.net/this_is_bug/category_12556429.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12556429&sharerefer=PC&sharesource=this_is_bug&sharefrom=from_link
謝謝閱讀,煩請關注:

后續將持續更新!!

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

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

相關文章

Vue 圖片預覽功能(含縮略圖)

眾所周知&#xff0c;常見的組件庫如Element、Ant Design&#xff0c;自帶的圖片預覽功能都沒有縮略圖&#xff0c;所以 需要單獨封裝一個圖片預覽的服務。 第三方庫&#xff1a;v-viewer 安裝&#xff1a; npm install v-viewer viewerjs 若使用報錯&#xff0c;可安裝指定…

手寫tomcat:基本功能實現(4)

邏輯架構 HTTP 請求與 Socket&#xff1a; 左側的 “HTTP 請求” 箭頭指向 “socket”&#xff0c;表示客戶端發送的 HTTP 請求通過 socket 傳輸到服務器。Socket 負責接收請求&#xff0c;并提取出其中的 請求路徑&#xff08;如 /first&#xff09;和 請求方法&#xff08;如…

jvm安全點(一)openjdk17 c++源碼垃圾回收安全點信號函數處理線程阻塞

1. 信號處理入口?? ??JVM_HANDLE_XXX_SIGNAL?? 是 JVM 處理信號的統一入口&#xff0c;負責處理 SIGSEGV、SIGBUS 等信號。??javaSignalHandler?? 是實際注冊到操作系統的信號處理函數&#xff0c;直接調用 JVM_HANDLE_XXX_SIGNAL。 ??2. 安全點輪詢頁的識別?? …

微信小程序:封裝表格組件并引用

一、效果 封裝表格組件,在父頁面中展示表格組件并顯示數據 二、表格組件 1、創建頁面 創建一個components文件夾,專門用于存儲組件的文件夾 創建Table表格組件 2、視圖層 (1)表頭數據 這里會從父組件中傳遞表頭數據,這里為columns,后續會講解數據由來 循環表頭數組,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 發送、2 路 TLK2711 接收 FMC 子卡模塊

產品概述 FMC216 是一款基于 VITA57.1 標準規范的 2 路 TLK2711 接收、2 路 TLK2711 發送 FMC 子卡模塊。該板卡支持 2 路 TLK2711 數據的收發&#xff0c;支持線速率 1.6Gbps&#xff0c;經過 TLK2711 高速串行收發器&#xff0c;可以將 1.6Gbps 的高速串行數據解串為 16 位并…

K8S Gateway API 快速開始、胎教級教程

假設有如下三個節點的 K8S 集群&#xff1a; ?? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至網關 API 中。在 Kubernetes …

時序數據庫IoTDB分布式架構解析與運維指南

一、IoTDB分布式架構概述 分布式系統由一組獨立的計算機組成&#xff0c;通過網絡通信&#xff0c;對外表現為一個統一的整體。IoTDB的原生分布式架構將服務分為兩個核心部分&#xff1a; ?ConfigNode&#xff08;CN&#xff09;?&#xff1a;管理節點&#xff0c;負責管理…

Ubuntu 20.04 LTS 中部署 網頁 + Node.js 應用 + Nginx 跨域配置 的詳細步驟

Ubuntu 20.04 LTS 中部署 網頁 Node.js 應用 Nginx 跨域配置 的詳細步驟 一、準備工作1、連接服務器2、更新系統 二、安裝 Node.js 環境1、安裝 Node.js 官方 PPA&#xff08;用于獲取最新穩定版&#xff09;&#xff1a;2、安裝 Node.js 和 npm&#xff08;LTS 長期支持版本…

3DVR制作的工具或平臺

3DVR&#xff08;三維虛擬現實&#xff09;是利用三維圖像技術和虛擬現實技術&#xff0c;將真實場景進行三維掃描并轉換成計算機可識別的三維模型&#xff0c;使用戶能夠在虛擬空間中自由漫游&#xff0c;體驗身臨其境的感覺。3DVR技術結合了全景拍攝和虛擬現實&#xff0c;提…

垂直智能體:企業AI落地的正確打開方式

在當前AI浪潮中&#xff0c;許多企業急于跟進&#xff0c;推出自己的AI智能體解決方案。然而&#xff0c;市場上大量出現的"萬能型"智能體卻鮮有真正解決實際問題的產品。本文將探討為何企業應該專注于開發垂直領域智能體&#xff0c;而非追求表面上的全能&#xff0…

軟件工程各種圖總結

目錄 1.數據流圖 2.N-S盒圖 3.程序流程圖 4.UML圖 UML用例圖 UML狀態圖 UML時序圖 5.E-R圖 首先要先了解整個軟件生命周期&#xff1a; 通常包含以下五個階段&#xff1a;需求分析-》設計-》編碼 -》測試-》運行和維護。 軟件工程中應用到的圖全部有&#xff1a;系統…

王者榮耀游戲測試場景題

如何測試一個新英雄&#xff1a;方法論與實踐維度 測試一個新英雄不僅僅是“打打打”&#xff0c;而是一套完整的測試流程&#xff0c;包括設計文檔驗證、功能驗證、數值驗證、性能驗證、交互驗證等。可以從以下多個角度展開&#xff1a; &#x1f50d; 1. 方法論維度 ? 測試…

第四天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 很抱歉的說一下&#xff0c;我昨天看白色巨塔電視劇&#xff0c;看的入迷了&#xff0c;同時也看出一些道理&#xff0c;學到東西&#xff1b; 但是把昨天的寫事情給忘記了&#xff0c;今天…

多模態大語言模型arxiv論文略讀(七十八)

AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ?? 論文標題&#xff1a;AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ?? 論文作者&#xff1a;Zhen Xing, Qi Dai, Zejia Weng, Zuxuan W…

優化 Spring Boot 應用啟動性能的實踐指南

1. 引言 Spring Boot 以其“開箱即用”的特性深受開發者喜愛,但隨著項目復雜度的增加,應用的啟動時間也可能會變得較長。對于云原生、Serverless 等場景而言,快速啟動是一個非常關鍵的指標。 2. 分析啟動過程 2.1 啟動階段概述 Spring Boot 的啟動流程主要包括以下幾個階…

Ubuntu下配置VScode出現#include錯誤請更新includePath的解決方法

首先Ubuntu新手小白一定要先安裝g&#xff0c;安裝方法是&#xff1a; 在桌面右鍵打開終端&#xff0c;輸入&#xff1a;sudo apt-get install g 安裝好g之后&#xff0c;在vscode終端輸入&#xff1a;g -v -E -x c - 輸出這些路徑&#xff0c;復制 如果還存在顯示cout不存在的…

【背包dp】小結

背包問題總結 一、什么是背包問題&#xff1f; 定義&#xff1a;給定一個容量為 W 的背包和 n 件物品&#xff0c;每件物品有一個重量 w[i] 和價值 v[i]&#xff0c;要求選擇若干物品放入背包&#xff0c;在不超過容量的前提下&#xff0c;使總價值最大。 背包問題本質是&am…

濟南國網數字化培訓班學習筆記-第三組-1-電力通信傳輸網認知

電力通信傳輸網認知 電力通信基本情況 傳輸介質 傳輸介質類型&#xff08;導引與非導引&#xff09; 導引傳輸介質&#xff0c;如電纜、光纖&#xff1b; 非導引傳輸介質&#xff0c;如無線電波&#xff1b; 傳輸介質的選擇影響信號傳輸質量 信號傳輸模式&#xff08;單工…

代碼隨想錄算法訓練營第六十四天| 圖論9—卡碼網47. 參加科學大會,94. 城市間貨物運輸 I

每日被新算法方式轟炸的一天&#xff0c;今天是dijkstra&#xff08;堆優化版&#xff09;以及Bellman_ford &#xff0c;嘗試理解中&#xff0c;屬于是只能照著代碼大概說一下在干嘛。 47. 參加科學大會 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

upload-labs通關筆記-第8關 文件上傳之點繞過

目錄 一、點繞過原理 二、deldot()函數 三、源碼分析 四、滲透實戰 1、構建腳本test8.php 2、打開靶場 3、bp開啟攔截 4、點擊上傳 5、bp攔截 6、后綴名增加點 7、發包并獲取腳本地址 8、訪問腳本 本文通過《upload-labs靶場通關筆記系列》來進行upload-labs靶場的滲…