鴻蒙學習筆記(5)-HTTP請求數據

一、Http請求數據

http模塊是鴻蒙內置的一個模塊,提供了網絡請求的能力。不需要再寫比較原始的AJAS代碼。

ps:在項目中如果要訪問網絡資源,不管是圖片文件還是網絡請求,必須給項目開放權限。

(1)網絡連接方式

HTTP數據請求連接:通過HTTP發起的一個單向數據請求。

WebSocket連接:使用WebSocket建立服務器與客戶端的雙向連接。

Socket連接:通過Socket進行數據傳輸,更加底層。

(2)涉及接口文檔

類型說明

http.createHttp()

創建一個HTTP請求,里面包括發起請求、中斷請求、訂閱/取消訂閱HTTP Response Header事件。

HttpRequest()

根據URL地址,發起HTTP網絡請求。

requestInStream()

根據URL地址,發起HTTP網絡請求并返回流式響應,得到二進制數據,應用到文件下載,從后端拿到的不再是JSON和字符串,而是二進制數據。
destroy()中斷請求任務。

(3)request接口開發步驟?

1、步驟概述

1、從@kit.NetworkKit中導入http命名空間。Kit是我們項目需要用到的各種服務,如網絡服務,分布式管理服務,藍牙通信等。

2、調用creatHttp()方法,創建一個HttpRequest對象。

3、調用該對象的request()方法,訂閱http響應頭事件,此接口會比request請求先返回。可以根據業務需要訂閱此消息。(此步驟不是必須,是用來監控響應頭信息,如果你想發請求給后端,想要先知道后端返回的數據是JSON還是文件之類的,可以用此監控,他會比內容先返回客戶端。)

4、調用該對象的equest()方法,傳入http請求的url地址和可選參數,發起網絡請求。

5、得到結果過后,按照實際業務需要,解析返回結果,篩選或者進行數據轉化。

6、調用該對象的off()方法,取消訂閱http響應頭事件。

7、當請求使用完畢時,調用destroy()方法主動銷毀。

2、封裝代碼:

//在common模塊中封裝一個基礎的請求工具import { http } from "@kit.NetworkKit";//封裝請求代碼,考慮到以后每個模塊都要發送請求,默認放在common模塊中。
//1、導入
export function MyRequest(url:string,method:http.RequestMethod,requestData:string){//2、創建http請求const httpRequest = http.createHttp()//3、可以用httprequest監聽響應頭(不是必須)httpRequest.on('headersReceive', (header: Object) => {console.info('header: ' + JSON.stringify(header));});httpRequest.request(url, {method:method,//請求方式header:{//設置請求頭//前端瀏覽器告訴后端,前端傳遞的數據格式'Content-Type': 'application/json'},extraData:requestData, //設置請求要傳給后端的數據connectTimeout:9000,  //前端發送數據給后端如果9秒沒有結果,前端主動終止行為readTimeout:9000, //讀取數據超過9秒,告訴前端請求失敗},(error:Error,data:http.HttpResponse)=>{//error沒有內容代表成功if (!error) {console.log(`請求成功,返回數據:${JSON.stringify(data)}`)// 取消訂閱HTTP響應頭事件。httpRequest.off('headersReceive');// 當該請求使用完畢時,開發者務必調用destroy方法主動銷毀該JavaScript Object。httpRequest.destroy();}else {console.log(`請求失敗,具體原因:${JSON.stringify(error)}`)// 取消訂閱HTTP響應頭事件。httpRequest.off('headersReceive');// 當該請求使用完畢時,開發者務必調用destroy方法主動銷毀該JavaScript Object。httpRequest.destroy();}})
}

?3、使用說明:

在頁面中要使用這個工具來測試請求是否成功,在common/index.ets文件中先暴露。

export  {MyRequest} from './src/main/ets/utils/HttpUtils'

在home頁面或者組件中,引入對應的函數

import {MyRequest} from '@ohos/common'///比如跟事件綁定,測試數據是否能收到
.onClick((event:ClickEvent) => {MyRequest('http://47.98.128.191:4001/home/swiperdate',http.RequestMethod.GET,'')})

此時可以看到日志可以收到:

?此時請求發送完畢能夠得到后端數據,但請求不是直接在頁面或者組件中編寫的代碼,而是提取到了common模塊中,如何拿到服務端的數據并顯示到頁面上,這才是需要解決的問題。

4、泛型編程

typescript中非常重要的一個概念:泛型編程

利用一個簡單的案例:

function computed(params1:number,params2:number):number{return params1 +params2
}computed(1,3)//編譯通過
computed('xiao','ming')//編譯失敗,因為只接受number類型

為了簡化上面的代碼,使代碼更加靈活,尤其是在數據約束上,既要增加約束,又要讓參數支持更多類型,或者更加靈活,設計方式便是采用泛型的方式來設計參數類型?。

function computed<T>(params1:T,params2:T):T{return params1 +params2
}computed<number>(1,3)   //編譯通過
computed<string>('xiao','ming')   //編譯通過
computed<bollean>(true,false)   //編譯通過

同一個函數因為有了泛型,可以多次使用 ,這里我們以上面出現的問題:如何拿到服務端的數據并顯示到頁面上,利用promise來解決。通過promise對象將異步的請求代碼封裝到容器中獲取到結果。

import { http } from "@kit.NetworkKit";
//BasicConstants下暴露基礎URL地址,和傳入的資源路徑拼接
import { BasicConstants} from '../../constants/BasicConstants'
//封裝請求代碼,考慮到以后每個模塊都要發送請求,默認放在common模塊中。
//1、導入
export function MyRequest(url:string,method:http.RequestMethod,requestData:string){//2、創建http請求const httpRequest = http.createHttp()return new Promise((reslove:(value:string)=>void,reject:(value?:string)=>void)=>{//request發送請求就是異步代碼httpRequest.request(//不再簡單是url,而是做一下拼接基礎地址BasicConstants.BASE_URL+url,{method:method,//請求方式header:{//設置請求頭//前端瀏覽器告訴后端,前端傳遞的數據格式'Content-Type': 'application/json'},extraData:requestData, //設置請求要傳給后端的數據connectTimeout:9000,  //前端發送數據給后端如果9秒沒有結果,前端主動終止行為readTimeout:9000, //讀取數據超過9秒,告訴前端請求失敗},(error:Error,data:http.HttpResponse)=>{//error沒有內容代表成功if (!error) {console.log(`請求成功,返回數據:${JSON.stringify(data,null,2)}`)reslove(JSON.stringify(data))// 取消訂閱HTTP響應頭事件。httpRequest.off('headersReceive');// 當該請求使用完畢時,開發者務必調用destroy方法主動銷毀該JavaScript Object。httpRequest.destroy();}else {console.log(`請求失敗,具體原因:${JSON.stringify(error)}`)reject(JSON.stringify(error))// 取消訂閱HTTP響應頭事件。httpRequest.off('headersReceive');// 當該請求使用完畢時,開發者務必調用destroy方法主動銷毀該JavaScript Object。httpRequest.destroy();}})})}

頁面中獲取請求返回的數據:?

?但此時傳入參數是固定必須是string類型,不夠靈活,接下來進一步封裝,利用泛型編程做進一步優化使得代碼實現復用。K代表請求的數據類型,T代表返回的數據類型

import { http } from "@kit.NetworkKit";
import { BasicConstants} from '../../constants/BasicConstants'
//封裝請求代碼,考慮到以后每個模塊都要發送請求,默認放在common模塊中。
//1、導入
//K代表請求的數據類型,T代表返回的數據類型
export function MyRequest<T,K>(url:string,method:http.RequestMethod,requestData?:K){//2、創建http請求const httpRequest = http.createHttp()return new Promise((reslove:(value:T)=>void,reject:(value?:string)=>void)=>{//request發送請求就是異步代碼httpRequest.request(//不再簡單是url,而是做一下拼接基礎地址BasicConstants.BASE_URL+url,{method:method,//請求方式header:{//設置請求頭//前端瀏覽器告訴后端,前端傳遞的數據格式'Content-Type': 'application/json'},extraData:JSON.stringify(requestData)||'', //設置請求要傳給后端的數據connectTimeout:9000,  //前端發送數據給后端如果9秒沒有結果,前端主動終止行為readTimeout:9000, //讀取數據超過9秒,告訴前端請求失敗},(error:Error,data:http.HttpResponse)=>{//error沒有內容代表成功if (!error) {console.log(`請求成功,返回數據:${JSON.stringify(data,null,2)}`)//這里如何reslove(JSON.parse(data.result as string))// 取消訂閱HTTP響應頭事件。httpRequest.off('headersReceive');// 當該請求使用完畢時,開發者務必調用destroy方法主動銷毀該JavaScript Object。httpRequest.destroy();}else {console.log(`請求失敗,具體原因:${JSON.stringify(error)}`)reject(JSON.stringify(error))// 取消訂閱HTTP響應頭事件。httpRequest.off('headersReceive');// 當該請求使用完畢時,開發者務必調用destroy方法主動銷毀該JavaScript Object。httpRequest.destroy();}})})}

?頁面中獲取請求返回的數據:?

完整工具封裝見資源文件。

(4)HTTP數據請求

4.1 導入HTTP模塊

import http from '@ohos.net.http';


4.2?使用HTTP模塊發送請求,處理響應.

4.2.1 創建一個http的請求對象,不可復用
const httpRequest = http.createHttp()
4.2.2 調用一個request方法,發起網絡請求。

ps:像這種可能存在數據請求發送完但數據還沒收到,因此此處方法執行完會存放一個未來會完成的結果Promise。

req.request('http://localhost:3000/users',//請求URL地址
{   //請求選項HttpRequestOptionsmetnod:http.RequestMethod.GET,extraData:{'param1':'value1'}    //k1=v1&k1=v2
}
) ?
HttpRequestOptions 說明:
名稱類型描述
methodRequestMethod請求方式,GET(查詢)、POST(表單提交,新增)、PUT(修改)、DELETE(刪除)等
extraDatastring|Object請求參數
headerObject請求頭字段
connectTimeoutnumber請求超時時間,單位毫秒,默認60000ms
readTimeoutnumber讀取超時間,同上


4.2.3?獲取服務器響應的內容,Promise提供兩種方法分別是then成功回調和catch失敗回調。
.then((resp:http.HttpResponse)=>{if(resp.responseCode === 200){//請求成功}})
.catch((err:Error)=>{//請求失敗
});
HttpResponse 說明:?
名稱類型描述
responseCoderesponseCode響應狀態碼
headerObject響應頭
cookiesstring響應返回的cookies
resultstring|Object響應體,默認是JSON字符串
resultTypeHttpDataType返回值類型

二、Promise

Promise是es6提出的一個概念,主要用來解決異步回調的問題。Promise是一個數據容器,保存了未來的一個結果,Promise本身是可以用來存放同步代碼和異步代碼,平時經常用來解決存放異步代碼。以下是網絡請求的一個發展歷程:

發送網絡請求,獲取結果

1.1 發送網絡請求

//"AJAX"(Asynchronous JavaScript and XML,異步 JavaScript 和 XML)
//瀏覽器默認提供的對象,獲取結果
const xmlhttp = new XMLhttpRequest()
//連接服務器
xmlhttp.open('GET','http://+地址',true)
xmlhttp.send('id=1')//監聽狀態碼,當狀態碼是200時
xmlhttp.onreadystatechange = function(){//首先狀態碼必須是200,readyState代表xmlhttp加載過程if(xmlhttp.status == 200 && xmlhttp.readyState == 4){const result = xmlhttp.responseText//拿到數據后轉化const obj = JSON.parse(result)}
}

1.2 將其封裝工具

function ajas( {method='GET',url,data='',async=true} ){//"AJAX"(Asynchronous JavaScript and XML,異步 JavaScript 和 XML)//瀏覽器默認提供的對象,獲取結果const xmlhttp = new XMLhttpRequest()//連接服務器xmlhttp.open(method,url,async)xmlhttp.send(data)//監聽狀態碼,當狀態碼是200時xmlhttp.onreadystatechange = function(){//首先狀態碼必須是200,readyState代表xmlhttp加載過程if(xmlhttp.status == 200 && xmlhttp.readyState == 4){const result = xmlhttp.responseText//拿到數據后轉化const obj = JSON.parse(result)//這里return obj沒有意義,這里是個事件,時間返回的函數外面是接收不到的}}
//如果在fuction函數這里return obj也是不可以的,局部的變量無法在外部用
}//使用封裝工具
ajax({method:'GET',url:'http://+地址',data:'id = 1'async:true
})

此時的obj還不能調出來使用,這時解決方法:在函數中在傳入一個函數?success,如果函數能進入if中實現結果的取用,將在函數中調用。

function ajas( {method='GET',url,data='',async=true,success} ){//"AJAX"(Asynchronous JavaScript and XML,異步 JavaScript 和 XML)//瀏覽器默認提供的對象,獲取結果const xmlhttp = new XMLhttpRequest()//連接服務器xmlhttp.open(method,url,async)xmlhttp.send(data)//監聽狀態碼,當狀態碼是200時xmlhttp.onreadystatechange = function(){//首先狀態碼必須是200,readyState代表xmlhttp加載過程if(xmlhttp.status == 200 && xmlhttp.readyState == 4){const result = xmlhttp.responseText//拿到數據后轉化const obj = JSON.parse(result)success(Obj)}else if(404 500){error('失敗')}}
}//使用封裝工具
ajax({method:'GET',url:'http://+地址',data:'id = 1'async:true,success:function(msg){console.log(msg)}//是否請求成功error:function(error){}   
})

?這樣做有缺陷:回調地獄,無限制的在回調函數中執行任務,得到回調結果,層層嵌套,開發中要避免,不存在可讀性。

//使用封裝工具
ajax({method:'GET',url:'http://+地址',data:'id = 1'async:true,success:function(msg){console.log(msg)ajax({url:'http://+地址',data:msg.id,success(msg2){  ajax({url:'',data:msg.classesId}//是否請求成功error:function(error){}   
})

Promise

由上述Promise來解決異步編程的問題。?

//按照1234執行順序來執行,因為promise本身是同步的,如果在promise中放入一個異步的代碼,異步代碼是需要花時間,異步代碼不論花費多長時間,等到代碼運行結束,成功或者失敗都會存放在resolve,reject中。
console.log(1)
//resolve,reject 這兩個參數是函數
const promise = new Promise((resolve,reject)=>{
console.log(2)//存放同步代碼或者異步代碼,這里主要存放異步代碼ajas({url:'http://xxx',method:'POST',data:{id:1},success:(msg)=>{resolve(msg)},error:(error)=>{reject(error)}}) 
})//then這個函數是異步的,只有resolve執行完畢,then才會執行
promise.then((result)=>{console.log(4)
})
.catch(error=>{})console.log(3)

?await和async

es7提出的一個新方案,可以等待promise的結果。

//resolve,reject 這兩個參數是函數
const promise2 = new Promise((resolve,reject)=>{//存放同步代碼或者異步代碼,這里主要存放異步代碼ajas({url:'http://xxx',method:'POST',data:{id:1},success:(msg)=>{resolve(msg)},error:(error)=>{reject(error)}}) 
})async function show(){const res1 = await promise1const res2 = await promise2
}

?axios工具

在前面代碼的基礎上,第三方工具axios做了一件事情,將axios代碼和promise代碼進行了封裝,形成了一個完整的請求工具。

//封裝格式
class Axios{baseURL =''get(){return new Promise (()=>{resolve(xxx)reject(xxx)})}post(){}creat(){}
}export const axios = new Axios()//代碼中如何使用
import axios from 'axios'
//方法1:通過then拿到服務器響應回來的結果
axios.get('http://xxx').then(res=>{{)
//方法2:通過await和async配合拿到服務器響應回來的結果
result = await axios.post('http://xxx')

作為一個第三方庫,使用的時候需要先完成下包的操作,打開終端執行命令,ohpm 是一個包管理工具,用來管理鴻蒙提供的第三方模塊。

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

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

相關文章

使用Redis5.X部署一個集群

文章目錄 1.用Redis5.x來創建Cluste2. 查看節點信息 nodes3. 添加節點 add-node4.刪除節點 del-node5.手動指定從節點 replicate6.檢查集群健康狀態 check 建議使用5.x版本。 首先&#xff0c;下載Redis&#xff0c;根據自己的環境選擇版本。 一鍵啟動Redis集群文件配置。 ech…

實現窗口函數

java 實現窗口函數 public class SlidingWin {public static void main(String[] args) {SlidingWin slidingWin = new SlidingWin();double v = slidingWin.SlidWin(2);System.out.println(v);}public double SlidWin(int k){int [] array =new int[]{2,4,5,6,9,10,12,23,1,…

Docker Compose 命令實現動態構建和部署

Docker Compose 命令實現動態構建和部署 一、編寫支持動態版本號的 docker-compose.yml version: 3.8services:myapp:build: context: . # Dockerfile所在目錄args:APP_VERSION: ${TAG:-latest} # 從環境變量獲取版本號&#xff0c;默認latestimage: myapp:${TAG:-latest} …

AI時代下 你需要和想要了解的英文縮寫含義

在AI智能時代下&#xff0c;越來愈多的企業都開始重視并應用以及開發AI相關產品&#xff0c;這個時候都會或多或少的涉及到英文&#xff0c;英文還好&#xff0c;但是如果是縮寫&#xff0c;如果我們沒有提前了解過&#xff0c;我們往往很難以快速Get到對方的意思。在這里&…

聊聊Doris的數據模型,如何用結構化設計解決實時分析難題

傳統 OLAP 系統的局限 在大數據實時分析領域&#xff0c;數據模型設計直接決定了系統的查詢性能、存儲效率與業務適配性。Apache Doris作為新一代MPP分析型數據庫&#xff0c;通過獨創的多模型融合架構&#xff0c;在業內率先實現了"一份數據支持多種分析范式"的能力…

基于vue框架的點餐系統設計及實現w93q6(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表 項目功能&#xff1a;用戶,菜品分類,菜品信息,配送員,訂單信息,配送進度,評價記錄 開題報告內容 基于 Vue 框架的點餐系統設計及實現開題報告 一、研究背景與意義 &#xff08;一&#xff09;研究背景 在當今快節奏的生活中&#xff0c;網上訂餐已成為人…

LeetCode 2563.統計公平數對的數目:排序 + 二分查找

【LetMeFly】2563.統計公平數對的數目&#xff1a;排序 二分查找 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 給你一個下標從 0 開始、長度為 n 的整數數組 nums &#xff0c;和兩個整數 lower 和 upper &#xff0c;返回 公平…

CF1016賽后總結

文章目錄 前言T1:Ideal GeneratorT2&#xff1a;Expensive NumberT3:Simple RepetitionT4&#xff1a;Skibidi TableT5:Min Max MEXT6:Hackers and Neural NetworksT7:Shorten the Array 前言 由于最近在半期考試&#xff0c;更新稍微晚了一點&#xff0c;還望大家見諒 &#…

HFSS3(limy)——建模學習記錄

前言——筆者使用的是21版HFSS 1.基本模型 為什么沒有環形的天線 2.創建基本模型方法 常用&#xff1a;先粗略建好模型再編輯輸入準確坐標和大小尺寸&#xff08;這里長方體起始點是左上角下方的點&#xff0c;也就是說要輸入模型起點相對于坐標原點的位置尺寸就可以確定具體…

API網關的作用?企業如何應用API網關?

一、API網關的用處 API網關我的分析中會用到以下三種場景。 1、Open API 企業需要將自身數據、能力等作為開發平臺向外開放&#xff0c;通常會以rest的方式向外提供。最好的例子就是淘寶開放平臺、騰訊公司的QQ開發平臺、微信開放平臺。 Open API開放平臺必然涉及到客戶應用…

國網B接口協議圖像數據上報通知接口流程詳解以及上報失敗原因(電網B接口)

文章目錄 一、B接口協議圖像數據上報通知接口介紹B.13.1 接口描述B.13.2 接口流程B.13.3 接口參數B.13.3.1 SIP頭字段B.13.3.2 SIP響應碼B.13.3.3 XML Schema參數定義 B.13.4 消息示例B.13.4.1 圖像數據上報請求B.13.4.2 圖像數據上報響應 二、B接口圖像數據上報通知失敗常見問…

springAi---智能客服

首先被取代的是客服類&#xff0c;智能客服機器人都能夠高效地完成任務。 spring Ai 大模型應用相關開發demo&#xff0c;智能客服系統&#xff1b; 在需求分析階段&#xff0c;把功能屬于傳統Java處理的和ai的功能進行分離 梳理為流程圖如下&#xff1a; 在大模型中&#…

Java面試(2025)——基礎

Java語言有哪些特點&#xff1f; Java語言具有多個顯著特點&#xff0c;使其在編程領域廣受歡迎。首先&#xff0c;Java的跨平臺性非常強&#xff0c;通過Java虛擬機&#xff08;JVM&#xff09;實現“編寫一次&#xff0c;隨處運行”&#xff0c;使得開發者能夠在不同操作系統…

Linux壓縮與解壓命令完全指南:tar.gz、zip等格式詳解

Linux壓縮與解壓命令完全指南&#xff1a;tar.gz、zip等格式詳解 在Linux系統中&#xff0c;文件壓縮和解壓是日常操作中不可或缺的一部分。本文將全面介紹Linux下常用的壓縮和解壓命令&#xff0c;包括tar.gz、tar、zip等格式的區別和使用方法&#xff0c;幫助你高效管理文件…

C++ STL 環形隊列模擬實現

C STL 環形隊列模擬實現 下面是一個使用C STL實現的環形隊列&#xff08;Circular Queue&#xff09;的完整示例&#xff1a; #include <iostream> #include <vector> #include <stdexcept>template <typename T> class CircularQueue { private:std…

部署rocketmq集群

容器化部署RocketMQ5.3.1集群 背景: 生產環境單機的MQ不具有高可用,所以我們應該部署成集群模式,這里給大家部署一個雙主雙從異步復制的Broker集群 一、安裝docker yum install -y docker systemctl enable docker --now # 單機部署參考: https://www.cnblogs.com/hsyw/p/1…

mysql的函數(第一期)

一、字符串函數?? 處理文本數據&#xff0c;常用函數&#xff1a; ??CONCAT(str1, str2, ...)?? ??作用??&#xff1a;拼接字符串。??示例??&#xff1a;SELECT CONCAT(Hello, , World); → Hello World??注意??&#xff1a;若任一參數為 NULL&#xff0c;…

Linux下的網絡管理

注意&#xff1a;本文使用的Linux系統版本為Red Hat Enterprise Linux 9 (RHEL 9)。 在RHEL9上&#xff0c;使用NM&#xff08;NetworkManager&#xff09;進行網絡配置&#xff0c;ifcfg &#xff08;也稱為 文件&#xff09;將不再是網絡配置文件的主存儲。雖然 ifcfg 樣式仍…

游戲引擎學習第233天

原地歸并排序地方很蒙圈 game_render_group.cpp&#xff1a;注意當前的SortEntries函數是O(n^2)&#xff0c;并引入一個提前退出的條件 其實我們不太討論這些話題&#xff0c;因為我并沒有深入研究過計算機科學&#xff0c;所以我也沒有太多內容可以分享。但希望在過去幾天里…

從《周游記3》演繹歌劇版《菊花臺》,周杰倫婚禮曲目意大利文版驚喜亮相

今天&#xff08;4月19日&#xff09;22:00&#xff0c;由魔胴西西里咖啡冠名的戶外實境互動綜藝《周游記3》第四期即將播出。本期節目中&#xff0c;“J式之旅”發起人周杰倫和林暐恒、杜國璋、陳冠霖、陳冠廷&#xff0c;將繼續意大利之旅&#xff0c;從那不勒斯的百年老店到…