前言
網(wǎng)絡(luò)封裝的目的,在于簡(jiǎn)潔,使用起來(lái)更加的方便,也易于我們進(jìn)行相關(guān)動(dòng)作的設(shè)置,如果,我們不封裝,那么每次請(qǐng)求,就會(huì)重復(fù)大量的代碼邏輯,如下代碼,是官方給出的案例:
// 引入包名
import http from '@ohos.net.http';
// 每一個(gè)httpRequest對(duì)應(yīng)一個(gè)HTTP請(qǐng)求任務(wù),不可復(fù)用
let httpRequest = http.createHttp();
// 用于訂閱HTTP響應(yīng)頭,此接口會(huì)比request請(qǐng)求先返回??梢愿鶕?jù)業(yè)務(wù)需要訂閱此消息
// 從API 8開(kāi)始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
// 填寫(xiě)HTTP請(qǐng)求的URL地址,可以帶參數(shù)也可以不帶參數(shù)。URL地址需要開(kāi)發(fā)者自定義。請(qǐng)求的參數(shù)可以在extraData中指定
"EXAMPLE_URL",
{
method: http.RequestMethod.POST, // 可選,默認(rèn)為http.RequestMethod.GET
// 開(kāi)發(fā)者根據(jù)自身業(yè)務(wù)需要添加header字段
header: {
'Content-Type': 'application/json'
},
// 當(dāng)使用POST請(qǐng)求時(shí)此字段用于傳遞內(nèi)容
extraData: {
"data": "data to send",
},
expectDataType: http.HttpDataType.STRING, // 可選,指定返回?cái)?shù)據(jù)的類型
usingCache: true, // 可選,默認(rèn)為true
priority: 1, // 可選,默認(rèn)為1
connectTimeout: 60000, // 可選,默認(rèn)為60000ms
readTimeout: 60000, // 可選,默認(rèn)為60000ms
usingProtocol: http.HttpProtocol.HTTP1_1, // 可選,協(xié)議類型默認(rèn)值由系統(tǒng)自動(dòng)指定
}, (err, data) => {
if (!err) {
// data.result為HTTP響應(yīng)內(nèi)容,可根據(jù)業(yè)務(wù)需要進(jìn)行解析
console.info('Result:' + JSON.stringify(data.result));
console.info('code:' + JSON.stringify(data.responseCode));
// data.header為HTTP響應(yīng)頭,可根據(jù)業(yè)務(wù)需要進(jìn)行解析
console.info('header:' + JSON.stringify(data.header));
console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
// 取消訂閱HTTP響應(yīng)頭事件
httpRequest.off('headersReceive');
// 當(dāng)該請(qǐng)求使用完畢時(shí),調(diào)用destroy方法主動(dòng)銷毀
httpRequest.destroy();
} else {
console.info('error:' + JSON.stringify(err));
// 取消訂閱HTTP響應(yīng)頭事件
httpRequest.off('headersReceive');
// 當(dāng)該請(qǐng)求使用完畢時(shí),調(diào)用destroy方法主動(dòng)銷毀。
httpRequest.destroy();
}
}
);
以上的案例,每次請(qǐng)求書(shū)寫(xiě)這么多代碼,在實(shí)際的開(kāi)發(fā)中,是無(wú)法承受的,所以基于此,封裝是很有必要的,把公共的部分進(jìn)行抽取包裝,固定不變的參數(shù)進(jìn)行初始化設(shè)置,重寫(xiě)基本的請(qǐng)求方式,這是我們封裝的基本宗旨。
我們先看一下封裝之后的調(diào)用方式:
異步請(qǐng)求
Net.get("url").requestString((data) => {
//data 為 返回的json字符串
})
同步請(qǐng)求
const data = await Net.get("url").returnData<string>(ReturnDataType.STRING)
//data 為 返回的json字符串
裝飾器請(qǐng)求
@GET("url")
private getData():Promise<string> {
return null
}
封裝之后,不僅使用起來(lái)更加的便捷,而且還拓展了請(qǐng)求類型,滿足不同需求的場(chǎng)景。
本篇的文章內(nèi)容大致如下:
1、net庫(kù)主要功能點(diǎn)介紹
2、net庫(kù)快速依賴使用
3、net庫(kù)全局初始化
4、異步請(qǐng)求介紹
5、同步請(qǐng)求介紹
6、裝飾器請(qǐng)求介紹
7、上傳下載介紹
8、Dialog加載使用
9、相關(guān)總結(jié)
一、net庫(kù)主要功能點(diǎn)介紹
目前net庫(kù)一期已經(jīng)開(kāi)發(fā)完畢,har包使用,大家可以看第二項(xiàng),截止到發(fā)文前,所支持的功能如下:
■?支持全局初始化
■?支持統(tǒng)一的BaseUrl
■?支持全局錯(cuò)誤攔截
■?支持全局頭參攔截
■?支持同步方式請(qǐng)求(get/post/delete/put/options/head/trace/connect)
■?支持異步方式請(qǐng)求(get/post/delete/put/options/head/trace/connect)
■?支持裝飾器方式請(qǐng)求(get/post/delete/put/options/head/trace/connect)
■?支持dialog加載
■?支持返回Json字符串
■?支持返回對(duì)象
■?支持返回?cái)?shù)組
■?支持返回data一層數(shù)據(jù)
■?支持上傳文件
■?支持下載文件
□?數(shù)據(jù)緩存開(kāi)發(fā)中……
二、net庫(kù)快速依賴使用
私服和遠(yuǎn)程依賴,由于權(quán)限和審核問(wèn)題,預(yù)計(jì)需要等到2024年第一季度面向所有開(kāi)發(fā)者,所以,只能使用本地靜態(tài)共享包和源碼?兩種使用方式,本地靜態(tài)共享包類似Android中的aar依賴,直接復(fù)制到項(xiàng)目中即可,目前源碼還在優(yōu)化中,先暴露靜態(tài)共享包這一使用方式。
本地靜態(tài)共享包har包使用
首先,下載har包,點(diǎn)擊下載
下載之后,把har包復(fù)制項(xiàng)目中,目錄自己創(chuàng)建,如下,我創(chuàng)建了一個(gè)libs目錄,復(fù)制進(jìn)去
引入之后,進(jìn)行同步項(xiàng)目,點(diǎn)擊Sync?Now即可,當(dāng)然了你也可以,將鼠標(biāo)放置在報(bào)錯(cuò)處會(huì)出現(xiàn)提示,在提示框中點(diǎn)擊Run?'ohpm?install'。
需要注意,@app/net,是用來(lái)區(qū)分目錄的,可以自己定義,比如@aa/bb等,關(guān)于靜態(tài)共享包的創(chuàng)建和使用,請(qǐng)查看如下我的介紹,這里就不過(guò)多介紹。
HarmonyOS開(kāi)發(fā):走進(jìn)靜態(tài)共享包的依賴與使用
查看是否引用成功
無(wú)論使用哪種方式進(jìn)行依賴,最終都會(huì)在使用的模塊中,生成一個(gè)oh_modules文件,并創(chuàng)建源代碼文件,有則成功,無(wú)則失敗,如下:
三、net庫(kù)全局初始化
推薦在AbilityStage進(jìn)行初始化,初始化一次即可,初始化參數(shù)可根據(jù)項(xiàng)目需要進(jìn)行選擇性使用。
Net.getInstance().init({
baseUrl: "https://www.vipandroid.cn", //設(shè)置全局baseurl
connectTimeout: 10000, //設(shè)置連接超時(shí)
readTimeout: 10000, //設(shè)置讀取超時(shí)
netErrorInterceptor: new MyNetErrorInterceptor(), //設(shè)置全局錯(cuò)誤攔截,需要自行創(chuàng)建,可在這里進(jìn)行錯(cuò)誤處理
netHeaderInterceptor: new MyNetHeaderInterceptor(), //設(shè)置全局頭攔截器,需要自行創(chuàng)建
header: {}, //頭參數(shù)
resultTag: []//接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等
})
1、初始化屬性介紹
初始化屬性,根據(jù)自己需要選擇性使用。
屬性 |
類型 |
概述 |
baseUrl |
string |
一般標(biāo)記為統(tǒng)一的請(qǐng)求前綴,也就是域名 |
connectTimeout |
number |
連接超時(shí),默認(rèn)10秒 |
readTimeout |
number |
讀取超時(shí),默認(rèn)10秒 |
netErrorInterceptor |
INetErrorInterceptor |
全局錯(cuò)誤攔截器,需繼承INetErrorInterceptor |
netHeaderInterceptor |
INetHeaderInterceptor |
全局請(qǐng)求頭攔截器,需繼承INetHeaderInterceptor |
header |
Object |
全局統(tǒng)一的公共頭參數(shù) |
resultTag |
Array |
接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等 |
?
2、設(shè)置請(qǐng)求頭攔截
關(guān)于全局頭參數(shù)傳遞,可以通過(guò)以上的header參數(shù)或者在請(qǐng)求頭攔截里均可,如果沒(méi)有同步等邏輯操作,只是固定的頭參數(shù),建議直接使用header參數(shù)。
名字自定義,實(shí)現(xiàn)INetHeaderInterceptor接口,可在netHeader方法里打印請(qǐng)求頭或者追加請(qǐng)求頭。
import { HttpHeaderOptions, NetHeaderInterceptor } from '@app/net'
class MyNetHeaderInterceptor implements NetHeaderInterceptor {
getHeader(options: HttpHeaderOptions): Promise<Object> {
//可以進(jìn)行接口簽名,傳入頭參數(shù)
return null
}
}
HttpHeaderOptions對(duì)象
返回了一些常用參數(shù),可以用于接口簽名等使用。
export class HttpHeaderOptions {
url?: string //請(qǐng)求地址
method?: http.RequestMethod //請(qǐng)求方式
header?: Object //頭參數(shù)
params?: Object //請(qǐng)求參數(shù)
}
3、設(shè)置全局錯(cuò)誤攔截器
名字自定義,實(shí)現(xiàn)INetErrorInterceptor接口,可在httpError方法里進(jìn)行全局的錯(cuò)誤處理,比如統(tǒng)一跳轉(zhuǎn),統(tǒng)一提示等。
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) {
//這里進(jìn)行攔截錯(cuò)誤信息
}
}
NetError對(duì)象
可通過(guò)如下方法獲取錯(cuò)誤code和錯(cuò)誤描述信息。
/*
* 返回code
* */
getCode():number{
return this.code
}
/*
* 返回message
* */
getMessage():string{
return this.message
}
四、異步請(qǐng)求介紹
1、請(qǐng)求說(shuō)明
為了方便數(shù)據(jù)的針對(duì)性返回,目前異步請(qǐng)求提供了三種請(qǐng)求方法,在實(shí)際的?開(kāi)發(fā)中,大家可以針對(duì)需要,選擇性使用。
request方法
Net.get("url").request<TestModel>((data) => {
//data 就是返回的TestModel對(duì)象
})
此方法,針對(duì)性返回對(duì)應(yīng)的data數(shù)據(jù)對(duì)象,如下json,則會(huì)直接返回需要的data對(duì)象,不會(huì)攜帶外層的code等其他參數(shù),方便大家直接的拿到數(shù)據(jù)。
{
"code": 0,
"message": "數(shù)據(jù)返回成功",
"data": {}
}
如果你的data是一個(gè)數(shù)組,如下json:
{
"code": 0,
"message": "數(shù)據(jù)返回成功",
"data": []
}
數(shù)組獲取
Net.get("url").request<TestModel[]>((data) => {
//data 就是返回的TestModel[]數(shù)組
})
//或者如下
Net.get("url").request<Array<TestModel>>((data) => {
//data 就是返回的TestModel數(shù)組
})
可能大家有疑問(wèn),如果接口返回的json字段不是data怎么辦?如下:
舉例一
{
"code": 0,
"message": "數(shù)據(jù)返回成功",
"items": {}
}
舉例二
{
"code": 0,
"message": "數(shù)據(jù)返回成功",
"models": {}
}
雖然網(wǎng)絡(luò)庫(kù)中默認(rèn)取的是json中的data字段,如果您的數(shù)據(jù)返回類型字段有多種,如上json,可以通過(guò)全局初始化resultTag進(jìn)行傳遞或者局部setResultTag傳遞即可。
全局設(shè)置接口返回?cái)?shù)據(jù)參數(shù)【推薦】
全局設(shè)置,具體設(shè)置請(qǐng)查看上邊的全局初始化一項(xiàng),只設(shè)置一次即可,不管你有多少種返回參數(shù),都可以統(tǒng)一設(shè)置。
Net.getInstance().init({
resultTag: ["data", "items", "models"]//接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等
})
局部設(shè)置接口返回?cái)?shù)據(jù)參數(shù)
通過(guò)setResultTag方法設(shè)置即可。
Net.get("")
.setResultTag(["items"])
.request<TestModel>((data) => {
})
requestString方法
requestString就比較簡(jiǎn)單,就是普通的返回請(qǐng)求回來(lái)的json字符串。
Net.get("url").requestString((data) => {
//data 為 返回的json字符串
})
requestObject方法
requestObject方法也是獲取對(duì)象,和request不同的是,它不用設(shè)置返回參數(shù),因?yàn)樗欠祷氐恼麄€(gè)json對(duì)應(yīng)的對(duì)象,?也就是包含了code,message等字段。
Net.get("url").requestObject<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
為了更好的復(fù)用共有字段,你可以抽取一個(gè)基類,如下:
export class ApiResult<T> {
code: number
message: string
data: T
}
以后就可以如下請(qǐng)求:
Net.get("url").requestObject<ApiResult<TestModel>>((data) => {
//data 為 返回的ApiResult對(duì)象
})
回調(diào)函數(shù)
回調(diào)函數(shù)有兩個(gè),一個(gè)成功一個(gè)失敗,成功回調(diào)必調(diào)用,失敗可選擇性調(diào)用。
只帶成功
Net.get("url").request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
成功失敗都帶
Net.get("url").request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
}, (error) => {
//失敗
})
2、get請(qǐng)求
Net.get("url").request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
3、post請(qǐng)求
Net.post("url").request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
4、delete請(qǐng)求
Net.delete("url").request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
5、put請(qǐng)求
Net.put("url").request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
6、其他請(qǐng)求方式
除了常見(jiàn)的請(qǐng)求之外,根據(jù)系統(tǒng)api所提供的,也封裝了如下的請(qǐng)求方式,只需要更改請(qǐng)求方式即可,比如Net.options。
OPTIONS
HEAD
TRACE
CONNECT
7、各個(gè)方法調(diào)用
除了正常的請(qǐng)求方式之外,你也可以調(diào)用如下的參數(shù):
方法 |
類型 |
概述 |
setHeaders |
Object |
單獨(dú)添加請(qǐng)求頭參數(shù) |
setBaseUrl |
string |
單獨(dú)替換BaseUrl |
setParams |
string?/?Object?/?ArrayBuffer |
單獨(dú)添加參數(shù),用于post |
setConnectTimeout |
number |
單獨(dú)設(shè)置連接超時(shí) |
setReadTimeout |
number |
單獨(dú)設(shè)置讀取超時(shí) |
setExpectDataType |
http.HttpDataType |
設(shè)置指定返回?cái)?shù)據(jù)的類型 |
setUsingCache |
boolean |
使用緩存,默認(rèn)為true |
setPriority |
number |
設(shè)置優(yōu)先級(jí)?默認(rèn)為1 |
setUsingProtocol |
http.HttpProtocol |
協(xié)議類型默認(rèn)值由系統(tǒng)自動(dòng)指定 |
setResultTag |
Array |
接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等 |
setContext |
Context |
設(shè)置上下文,用于下載文件 |
setCustomDialogController |
CustomDialogController |
傳遞的dialog控制器,用于展示dialog |
代碼調(diào)用如下:
Net.get("url")
.setHeaders({})//單獨(dú)添加請(qǐng)求頭參數(shù)
.setBaseUrl("")//單獨(dú)替換BaseUrl
.setParams({})//單獨(dú)添加參數(shù)
.setConnectTimeout(10000)//單獨(dú)設(shè)置連接超時(shí)
.setReadTimeout(10000)//單獨(dú)設(shè)置讀取超時(shí)
.setExpectDataType(http.HttpDataType.OBJECT)//設(shè)置指定返回?cái)?shù)據(jù)的類型
.setUsingCache(true)//使用緩存,默認(rèn)為true
.setPriority(1)//設(shè)置優(yōu)先級(jí) 默認(rèn)為1
.setUsingProtocol(http.HttpProtocol.HTTP1_1)//協(xié)議類型默認(rèn)值由系統(tǒng)自動(dòng)指定
.setResultTag([""])//接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等
.setContext(this.context)//設(shè)置上下文,用于上傳文件和下載文件
.setCustomDialogController()//傳遞的dialog控制器,用于展示dialog
.request<TestModel>((data) => {
//data 為 返回的TestModel對(duì)象
})
五、同步請(qǐng)求介紹
同步請(qǐng)求需要注意,需要await關(guān)鍵字和async關(guān)鍵字結(jié)合使用。
private async getTestModel(){
const testModel = await Net.get("url").returnData<TestModel>()
}
1、請(qǐng)求說(shuō)明
同步請(qǐng)求和異步請(qǐng)求一樣,也是有三種方式,是通過(guò)參數(shù)的形式,默認(rèn)直接返回data層數(shù)據(jù)。
返回data層數(shù)據(jù)
和異步種的request方法類似,只返回json種的data層對(duì)象數(shù)據(jù),不會(huì)返回code等字段。
private async getData(){
const data = await Net.get("url").returnData<TestModel>()
//data為 返回的 TestModel對(duì)象
}
返回Json對(duì)象
和異步種的requestObject方法類似,會(huì)返回整個(gè)json對(duì)象,包含code等字段。
private async getData(){
const data = await Net.get("url").returnData<TestModel>(ReturnDataType.OBJECT)
//data為 返回的 TestModel對(duì)象
}
返回Json字符串
和異步種的requestString方法類似。
private async getData(){
const data = await Net.get("url").returnData<string>(ReturnDataType.STRING)
//data為 返回的 json字符串
}
返回錯(cuò)誤
異步方式有回調(diào)錯(cuò)誤,同步方式如果發(fā)生錯(cuò)誤,也會(huì)直接返回錯(cuò)誤,結(jié)構(gòu)如下:
{
"code": 0,
"message": "錯(cuò)誤信息"
}
除了以上的錯(cuò)誤捕獲之外,你也可以全局異常捕獲,
2、get請(qǐng)求
const data = await Net.get("url").returnData<TestModel>()
3、post請(qǐng)求
const data = await Net.post("url").returnData<TestModel>()
4、delete請(qǐng)求
const data = await Net.delete("url").returnData<TestModel>()
5、put請(qǐng)求
const data = await Net.put("url").returnData<TestModel>()
6、其他請(qǐng)求方式
除了常見(jiàn)的請(qǐng)求之外,根據(jù)系統(tǒng)api所提供的,也封裝了如下的請(qǐng)求方式,只需要更改請(qǐng)求方式即可,比如Net.options
OPTIONS
HEAD
TRACE
CONNECT
7、各個(gè)方法調(diào)用
除了正常的請(qǐng)求方式之外,你也可以調(diào)用如下的參數(shù):
方法 |
類型 |
概述 |
setHeaders |
Object |
單獨(dú)添加請(qǐng)求頭參數(shù) |
setBaseUrl |
string |
單獨(dú)替換BaseUrl |
setParams |
string?/?Object?/?ArrayBuffer |
單獨(dú)添加參數(shù),用于post |
setConnectTimeout |
number |
單獨(dú)設(shè)置連接超時(shí) |
setReadTimeout |
number |
單獨(dú)設(shè)置讀取超時(shí) |
setExpectDataType |
http.HttpDataType |
設(shè)置指定返回?cái)?shù)據(jù)的類型 |
setUsingCache |
boolean |
使用緩存,默認(rèn)為true |
setPriority |
number |
設(shè)置優(yōu)先級(jí)?默認(rèn)為1 |
setUsingProtocol |
http.HttpProtocol |
協(xié)議類型默認(rèn)值由系統(tǒng)自動(dòng)指定 |
setResultTag |
Array |
接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等 |
setContext |
Context |
設(shè)置上下文,用于下載文件 |
setCustomDialogController |
CustomDialogController |
傳遞的dialog控制器,用于展示dialog |
代碼調(diào)用如下:
const data = await Net.get("url")
.setHeaders({})//單獨(dú)添加請(qǐng)求頭參數(shù)
.setBaseUrl("")//單獨(dú)替換BaseUrl
.setParams({})//單獨(dú)添加參數(shù)
.setConnectTimeout(10000)//單獨(dú)設(shè)置連接超時(shí)
.setReadTimeout(10000)//單獨(dú)設(shè)置讀取超時(shí)
.setExpectDataType(http.HttpDataType.OBJECT)//設(shè)置指定返回?cái)?shù)據(jù)的類型
.setUsingCache(true)//使用緩存,默認(rèn)為true
.setPriority(1)//設(shè)置優(yōu)先級(jí) 默認(rèn)為1
.setUsingProtocol(http.HttpProtocol.HTTP1_1)//協(xié)議類型默認(rèn)值由系統(tǒng)自動(dòng)指定
.setResultTag([""])//接口返回?cái)?shù)據(jù)參數(shù),比如data,items等等
.setContext(this.context)//設(shè)置上下文,用于上傳文件和下載文件
.setCustomDialogController()//傳遞的dialog控制器,用于展示dialog
.returnData<TestModel>()
//data為 返回的 TestModel對(duì)象
六、裝飾器請(qǐng)求介紹
網(wǎng)絡(luò)庫(kù)允許使用裝飾器的方式發(fā)起請(qǐng)求,也就是通過(guò)注解的方式,目前采取的是裝飾器方法的形式。
1、請(qǐng)求說(shuō)明
裝飾器和同步異步有所區(qū)別,只返回兩種數(shù)據(jù)類型,一種是json字符串,一種是json對(duì)象,暫時(shí)不提供返回data層數(shù)據(jù)。?在使用的時(shí)候,您可以單獨(dú)創(chuàng)建工具類或者ViewModel或者直接使用,都可以。
返回json字符串
@GET("url")
private getData():Promise<string> {
return null
}
返回json對(duì)象
@GET("url")
private getData():Promise<TestModel> {
return null
}
2、get請(qǐng)求
@GET("url")
private getData():Promise<TestModel> {
return null
}
3、post請(qǐng)求
@POST("url")
private getData():Promise<TestModel> {
return null
}
4、delete請(qǐng)求
@DELETE("url")
private getData():Promise<TestModel> {
return null
}
5、put請(qǐng)求
@PUT("url")
private getData():Promise<TestModel> {
return null
}
6、其他請(qǐng)求方式
除了常見(jiàn)的請(qǐng)求之外,根據(jù)系統(tǒng)api所提供的,也封裝了如下的請(qǐng)求方式,只需要更改請(qǐng)求方式即可,比如@OPTIONS。
OPTIONS
HEAD
TRACE
CONNECT
當(dāng)然,大家也可以使用統(tǒng)一的NET裝飾器,只不過(guò)需要自己設(shè)置請(qǐng)求方法,代碼如下:
@NET("url", { method: http.RequestMethod.POST })
private getData():Promise<string> {
return null
}
7、裝飾器參數(shù)傳遞
直接參數(shù)傳遞
直接參數(shù),在調(diào)用裝飾器請(qǐng)求時(shí),后面添加即可,一般針對(duì)固定參數(shù)。
@GET("url", {
baseUrl: "", //baseUrl
header: {}, //頭參數(shù)
params: {}, //入?yún)? connectTimeout: 1000, //連接超時(shí)
readTimeout: 1000, //讀取超時(shí)
isReturnJson: true//默認(rèn)false 返回Json字符串,默認(rèn)返回json對(duì)象
})
private getData():Promise<string> {
return null
}
動(dòng)態(tài)參數(shù)傳遞
動(dòng)態(tài)參數(shù)適合參數(shù)可變的情況下傳遞,比如分頁(yè)等情況。
@GET("url")
private getData(data? : HttpOptions):Promise<string> {
return null
}
調(diào)用時(shí)傳遞
private async doHttp(){
const data = await this.getData({
baseUrl: "", //baseUrl
header: {}, //頭參數(shù)
params: {}, //入?yún)? connectTimeout: 1000, //連接超時(shí)
readTimeout: 1000, //讀取超時(shí)
isReturnJson: true//默認(rèn)false 返回Json字符串,默認(rèn)返回json對(duì)象
})
}
裝飾器參數(shù)傳遞
使用DATA裝飾器,DATA必須在上!
@DATA({
baseUrl: "", //baseUrl
header: {}, //頭參數(shù)
params: {}, //入?yún)? connectTimeout: 1000, //連接超時(shí)
readTimeout: 1000, //讀取超時(shí)
isReturnJson: true//默認(rèn)false 返回Json字符串,默認(rèn)返回json對(duì)象
})
@GET("url")
private getData():Promise<string> {
return null
}
七、上傳下載介紹
1、上傳文件
Net.uploadFile("")//上傳的地址
.setUploadFiles([])//上傳的文件 [{ filename: "test", name: "test", uri: "internal://cache/test.jpg", type: "jpg" }]
.setUploadData([])//上傳的參數(shù) [{ name: "name123", value: "123" }]
.setProgress((receivedSize, totalSize) => {
//監(jiān)聽(tīng)上傳進(jìn)度
})
.request((data) => {
if (data == UploadTaskState.COMPLETE) {
//上傳完成
}
})
方法介紹
方法 |
類型 |
概述 |
uploadFile |
string |
上傳的地址 |
setUploadFiles |
Array |
上傳的文件數(shù)組 |
setUploadData |
Array |
上傳的參數(shù)數(shù)組 |
setProgress |
回調(diào)函數(shù) |
監(jiān)聽(tīng)進(jìn)度,receivedSize下載大小,?totalSize總大小 |
request |
無(wú) |
請(qǐng)求上傳,data類型為UploadTaskState,有三種狀態(tài):START(開(kāi)始),COMPLETE(完成),ERROR(錯(cuò)誤) |
其他方法
刪除上傳進(jìn)度監(jiān)聽(tīng)
uploadRequest.removeProgressCallback()
刪除上傳任務(wù)
uploadRequest.deleteUploadTask((result) => {
if (result) {
//成功
} else {
//失敗
}
})
2、下載文件
Net.downLoadFile("http://10.47.24.237:8888/harmony/log.har")
.setContext(EntryAbility.context)
.setFilePath(EntryAbility.filePath)
.setProgress((receivedSize, totalSize) => {
//監(jiān)聽(tīng)下載進(jìn)度
})
.request((data) => {
if (data == DownloadTaskState.COMPLETE) {
//下載完成
}
})
方法介紹
方法 |
類型 |
概述 |
downLoadFile |
string |
下載的地址 |
setContext |
Context |
上下文 |
setFilePath |
string |
下載后保存的路徑 |
setProgress |
回調(diào)函數(shù) |
監(jiān)聽(tīng)進(jìn)度,receivedSize下載大小,?totalSize總大小 |
request |
無(wú) |
請(qǐng)求下載,data類型為DownloadTaskState,有四種狀態(tài):START(開(kāi)始),COMPLETE(完成),PAUSE(暫停),REMOVE(結(jié)束) |
其他方法
移除下載的任務(wù)
downLoadRequest.deleteDownloadTask((result) => {
if (result) {
//移除成功
} else {
//移除失敗
}
})
暫停下載任務(wù)
downLoadRequest.suspendDownloadTask((result) => {
if (result) {
//暫停成功
} else {
//暫停失敗
}
})
重新啟動(dòng)下載任務(wù)
downLoadRequest.restoreDownloadTask((result) => {
if (result) {
//成功
} else {
//失敗
}
})
刪除監(jiān)聽(tīng)下載進(jìn)度
downLoadRequest.removeProgressCallback()
八、Dialog加載使用
1、定義dialog控制器
NetLoadingDialog是net包中自帶的,菊花狀彈窗,如果和實(shí)際業(yè)務(wù)不一致,可以更換。
private mCustomDialogController = new CustomDialogController({
builder: NetLoadingDialog({
loadingText: '請(qǐng)等待...'
}),
autoCancel: false,
customStyle: true
})
2、調(diào)用傳遞控制器方法
此方法會(huì)自動(dòng)顯示和隱藏dialog,如果覺(jué)得不合適,大家可以自己定義即可。
setCustomDialogController(this.mCustomDialogController)
九、相關(guān)總結(jié)
開(kāi)發(fā)環(huán)境如下:
DevEco?Studio?4.0?Beta2,Build?Version:?4.0.0.400
Api版本:9
hvigorVersion:3.0.2文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-736425.html
目前呢,暫時(shí)不支持緩存,后續(xù)會(huì)逐漸加上,大家在使用的過(guò)程中,需要任何的問(wèn)題,都可以進(jìn)行反饋,都會(huì)第一時(shí)間進(jìn)行解決。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-736425.html
到了這里,關(guān)于HarmonyOS開(kāi)發(fā):基于http開(kāi)源一個(gè)網(wǎng)絡(luò)請(qǐng)求庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!