前言
网络封装的目的,在于简练,运用起来更加的便利,也易于我们进行相关动作的设置,假如,我们不封装,那么每次恳求,就会重复大量的代码逻辑,如下代码,是官方给出的案例:
// 引入包名
import http from '@ohos.net.http';
// 每一个httpRequest对应一个HTTP恳求使命,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP呼应头,此接口会比request恳求先回来。能够依据事务需求订阅此消息
// 从API 8开端,运用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
// 填写HTTP恳求的URL地址,能够带参数也能够不带参数。URL地址需求开发者自界说。恳求的参数能够在extraData中指定
"EXAMPLE_URL",
{
method: http.RequestMethod.POST, // 可选,默以为http.RequestMethod.GET
// 开发者依据本身事务需求增加header字段
header: {
'Content-Type': 'application/json'
},
// 当运用POST恳求时此字段用于传递内容
extraData: {
"data": "data to send",
},
expectDataType: http.HttpDataType.STRING, // 可选,指定回来数据的类型
usingCache: true, // 可选,默以为true
priority: 1, // 可选,默以为1
connectTimeout: 60000, // 可选,默以为60000ms
readTimeout: 60000, // 可选,默以为60000ms
usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默许值由体系主动指定
}, (err, data) => {
if (!err) {
// data.result为HTTP呼应内容,可依据事务需求进行解析
console.info('Result:' + JSON.stringify(data.result));
console.info('code:' + JSON.stringify(data.responseCode));
// data.header为HTTP呼应头,可依据事务需求进行解析
console.info('header:' + JSON.stringify(data.header));
console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
// 撤销订阅HTTP呼应头事情
httpRequest.off('headersReceive');
// 当该恳求运用结束时,调用destroy办法主动毁掉
httpRequest.destroy();
} else {
console.info('error:' + JSON.stringify(err));
// 撤销订阅HTTP呼应头事情
httpRequest.off('headersReceive');
// 当该恳求运用结束时,调用destroy办法主动毁掉。
httpRequest.destroy();
}
}
);
以上的案例,每次恳求书写这么多代码,在实际的开发中,是无法接受的,所以依据此,封装是很有必要的,把公共的部分进行抽取包装,固定不变的参数进行初始化设置,重写根本的恳求办法,这是我们封装的根本主旨。
我们先看一下封装之后的调用办法:
异步恳求
Net.get("url").requestString((data) => {
//data 为 回来的json字符串
})
同步恳求
const data = await Net.get("url").returnData<string>(ReturnDataType.STRING)
//data 为 回来的json字符串
装修器恳求
@GET("url")
private getData():Promise<string> {
return null
}
封装之后,不仅运用起来更加的便捷,而且还拓宽了恳求类型,满意不同需求的场景。
本篇的文章内容大致如下:
1、net库主要功用点介绍
2、net库快速依靠运用
3、net库大局初始化
4、异步恳求介绍
5、同步恳求介绍
6、装修器恳求介绍
7、上传下载介绍
8、Dialog加载运用
9、相关总结
一、net库主要功用点介绍
目前net库一期现已开发结束,har包运用,我们能够看第二项,截止到发文前,所支撑的功用如下:
■支撑大局初始化
■支撑一致的BaseUrl
■支撑大局过错阻拦
■支撑大局头参阻拦
■支撑同步办法恳求(get/post/delete/put/options/head/trace/connect)
■支撑异步办法恳求(get/post/delete/put/options/head/trace/connect)
■支撑装修器办法恳求(get/post/delete/put/options/head/trace/connect)
■支撑dialog加载
■支撑回来Json字符串
■支撑回来目标
■支撑回来数组
■支撑回来data一层数据
■支撑上传文件
■支撑下载文件
□数据缓存开发中……
二、net库快速依靠运用
私服和长途依靠,由于权限和审阅问题,预计需求比及2024年第一季度面向所有开发者,所以,只能运用本地静态同享包和源码两种运用办法,本地静态同享包相似Android中的aar依靠,直接仿制到项目中即可,目前源码还在优化中,先暴露静态同享包这一运用办法。
本地静态同享包har包运用
首要,下载har包,点击下载
下载之后,把har包仿制项目中,目录自己创立,如下,我创立了一个libs目录,仿制进去

引入之后,进行同步项目,点击SyncNow即可,当然了你也能够,将鼠标放置在报错处会呈现提示,在提示框中点击Run’ohpminstall‘。
需求留意,@app/net,是用来区别目录的,能够自己界说,比方@aa/bb等,关于静态同享包的创立和运用,请检查如下我的介绍,这儿就不过多介绍。
检查是否引用成功
无论运用哪种办法进行依靠,终究都会在运用的模块中,生成一个oh_modules文件,并创立源代码文件,有则成功,无则失利,如下:

三、net库大局初始化
引荐在AbilityStage进行初始化,初始化一次即可,初始化参数可依据项目需求进行选择性运用。
Net.getInstance().init({
baseUrl: "https://www.vipandroid.cn", //设置大局baseurl
connectTimeout: 10000, //设置衔接超时
readTimeout: 10000, //设置读取超时
netErrorInterceptor: new MyNetErrorInterceptor(), //设置大局过错阻拦,需求自行创立,可在这儿进行过错处理
netHeaderInterceptor: new MyNetHeaderInterceptor(), //设置大局头阻拦器,需求自行创立
header: {}, //头参数
resultTag: []//接口回来数据参数,比方data,items等等
})
1、初始化特点介绍
初始化特点,依据自己需求选择性运用。
特点 | 类型 | 概述 |
---|---|---|
baseUrl | string | 一般标记为一致的恳求前缀,也便是域名 |
connectTimeout | number | 衔接超时,默许10秒 |
readTimeout | number | 读取超时,默许10秒 |
netErrorInterceptor | INetErrorInterceptor | 大局过错阻拦器,需承继INetErrorInterceptor |
netHeaderInterceptor | INetHeaderInterceptor | 大局恳求头阻拦器,需承继INetHeaderInterceptor |
header | Object | 大局一致的公共头参数 |
resultTag | Array | 接口回来数据参数,比方data,items等等 |
2、设置恳求头阻拦
关于大局头参数传递,能够经过以上的header参数或许在恳求头阻拦里均可,假如没有同步等逻辑操作,只是固定的头参数,主张直接运用header参数。
姓名自界说,完结INetHeaderInterceptor接口,可在netHeader办法里打印恳求头或许追加恳求头。
import { HttpHeaderOptions, NetHeaderInterceptor } from '@app/net'
class MyNetHeaderInterceptor implements NetHeaderInterceptor {
getHeader(options: HttpHeaderOptions): Promise<Object> {
//能够进行接口签名,传入头参数
return null
}
}
HttpHeaderOptions目标
回来了一些常用参数,能够用于接口签名等运用。
export class HttpHeaderOptions {
url?: string //恳求地址
method?: http.RequestMethod //恳求办法
header?: Object //头参数
params?: Object //恳求参数
}
3、设置大局过错阻拦器
姓名自界说,完结INetErrorInterceptor接口,可在httpError办法里进行大局的过错处理,比方一致跳转,一致提示等。
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) {
//这儿进行阻拦过错信息
}
}
NetError目标
可经过如下办法获取过错code和过错描述信息。
/*
* 回来code
* */
getCode():number{
return this.code
}
/*
* 回来message
* */
getMessage():string{
return this.message
}
四、异步恳求介绍
1、恳求阐明
为了便利数据的针对性回来,目前异步恳求供给了三种恳求办法,在实际的开发中,我们能够针对需求,选择性运用。
request办法
Net.get("url").request<TestModel>((data) => {
//data 便是回来的TestModel目标
})
此办法,针对性回来对应的data数据目标,如下json,则会直接回来需求的data目标,不会带着外层的code等其他参数,便利我们直接的拿到数据。
{
"code": 0,
"message": "数据回来成功",
"data": {}
}
假如你的data是一个数组,如下json:
{
"code": 0,
"message": "数据回来成功",
"data": []
}
数组获取
Net.get("url").request<TestModel[]>((data) => {
//data 便是回来的TestModel[]数组
})
//或许如下
Net.get("url").request<Array<TestModel>>((data) => {
//data 便是回来的TestModel数组
})
或许我们有疑问,假如接口回来的json字段不是data怎么办?如下:
举例一
{
"code": 0,
"message": "数据回来成功",
"items": {}
}
举例二
{
"code": 0,
"message": "数据回来成功",
"models": {}
}
尽管网络库中默许取的是json中的data字段,假如您的数据回来类型字段有多种,如上json,能够经过大局初始化resultTag进行传递或许部分setResultTag传递即可。
大局设置接口回来数据参数【引荐】
大局设置,具体设置请检查上边的大局初始化一项,只设置一次即可,不管你有多少种回来参数,都能够一致设置。
Net.getInstance().init({
resultTag: ["data", "items", "models"]//接口回来数据参数,比方data,items等等
})
部分设置接口回来数据参数
经过setResultTag办法设置即可。
Net.get("")
.setResultTag(["items"])
.request<TestModel>((data) => {
})
requestString办法
requestString就比较简单,便是一般的回来恳求回来的json字符串。
Net.get("url").requestString((data) => {
//data 为 回来的json字符串
})
requestObject办法
requestObject办法也是获取目标,和request不同的是,它不必设置回来参数,因为它是回来的整个json对应的目标,也便是包含了code,message等字段。
Net.get("url").requestObject<TestModel>((data) => {
//data 为 回来的TestModel目标
})
为了更好的复用共有字段,你能够抽取一个基类,如下:
export class ApiResult<T> {
code: number
message: string
data: T
}
以后就能够如下恳求:
Net.get("url").requestObject<ApiResult<TestModel>>((data) => {
//data 为 回来的ApiResult目标
})
回调函数
回调函数有两个,一个成功一个失利,成功回调必调用,失利可选择性调用。
只带成功
Net.get("url").request<TestModel>((data) => {
//data 为 回来的TestModel目标
})
成功失利都带
Net.get("url").request<TestModel>((data) => {
//data 为 回来的TestModel目标
}, (error) => {
//失利
})
2、get恳求
Net.get("url").request<TestModel>((data) => {
//data 为 回来的TestModel目标
})
3、post恳求
Net.post("url").request<TestModel>((data) => {
//data 为 回来的TestModel目标
})
4、delete恳求
Net.delete("url").request<TestModel>((data) => {
//data 为 回来的TestModel目标
})
5、put恳求
Net.put("url").request<TestModel>((data) => {
//data 为 回来的TestModel目标
})
6、其他恳求办法
除了常见的恳求之外,依据体系api所供给的,也封装了如下的恳求办法,只需求更改恳求办法即可,比方Net.options。
OPTIONS
HEAD
TRACE
CONNECT
7、各个办法调用
除了正常的恳求办法之外,你也能够调用如下的参数:
办法 | 类型 | 概述 |
---|---|---|
setHeaders | Object | 独自增加恳求头参数 |
setBaseUrl | string | 独自替换BaseUrl |
setParams | string/Object/ArrayBuffer | 独自增加参数,用于post |
setConnectTimeout | number | 独自设置衔接超时 |
setReadTimeout | number | 独自设置读取超时 |
setExpectDataType | http.HttpDataType | 设置指定回来数据的类型 |
setUsingCache | boolean | 运用缓存,默以为true |
setPriority | number | 设置优先级默以为1 |
setUsingProtocol | http.HttpProtocol | 协议类型默许值由体系主动指定 |
setResultTag | Array | 接口回来数据参数,比方data,items等等 |
setContext | Context | 设置上下文,用于下载文件 |
setCustomDialogController | CustomDialogController | 传递的dialog控制器,用于展现dialog |
代码调用如下:
Net.get("url")
.setHeaders({})//独自增加恳求头参数
.setBaseUrl("")//独自替换BaseUrl
.setParams({})//独自增加参数
.setConnectTimeout(10000)//独自设置衔接超时
.setReadTimeout(10000)//独自设置读取超时
.setExpectDataType(http.HttpDataType.OBJECT)//设置指定回来数据的类型
.setUsingCache(true)//运用缓存,默以为true
.setPriority(1)//设置优先级 默以为1
.setUsingProtocol(http.HttpProtocol.HTTP1_1)//协议类型默许值由体系主动指定
.setResultTag([""])//接口回来数据参数,比方data,items等等
.setContext(this.context)//设置上下文,用于上传文件和下载文件
.setCustomDialogController()//传递的dialog控制器,用于展现dialog
.request<TestModel>((data) => {
//data 为 回来的TestModel目标
})
五、同步恳求介绍
同步恳求需求留意,需求await关键字和async关键字结合运用。
private async getTestModel(){
const testModel = await Net.get("url").returnData<TestModel>()
}
1、恳求阐明
同步恳求和异步恳求一样,也是有三种办法,是经过参数的办法,默许直接回来data层数据。
回来data层数据
和异步种的request办法相似,只回来json种的data层目标数据,不会回来code等字段。
private async getData(){
const data = await Net.get("url").returnData<TestModel>()
//data为 回来的 TestModel目标
}
回来Json目标
和异步种的requestObject办法相似,会回来整个json目标,包含code等字段。
private async getData(){
const data = await Net.get("url").returnData<TestModel>(ReturnDataType.OBJECT)
//data为 回来的 TestModel目标
}
回来Json字符串
和异步种的requestString办法相似。
private async getData(){
const data = await Net.get("url").returnData<string>(ReturnDataType.STRING)
//data为 回来的 json字符串
}
回来过错
异步办法有回调过错,同步办法假如发生过错,也会直接回来过错,结构如下:
{
"code": 0,
"message": "过错信息"
}
除了以上的过错捕获之外,你也能够大局异常捕获,
2、get恳求
const data = await Net.get("url").returnData<TestModel>()
3、post恳求
const data = await Net.post("url").returnData<TestModel>()
4、delete恳求
const data = await Net.delete("url").returnData<TestModel>()
5、put恳求
const data = await Net.put("url").returnData<TestModel>()
6、其他恳求办法
除了常见的恳求之外,依据体系api所供给的,也封装了如下的恳求办法,只需求更改恳求办法即可,比方Net.options
OPTIONS
HEAD
TRACE
CONNECT
7、各个办法调用
除了正常的恳求办法之外,你也能够调用如下的参数:
办法 | 类型 | 概述 |
---|---|---|
setHeaders | Object | 独自增加恳求头参数 |
setBaseUrl | string | 独自替换BaseUrl |
setParams | string/Object/ArrayBuffer | 独自增加参数,用于post |
setConnectTimeout | number | 独自设置衔接超时 |
setReadTimeout | number | 独自设置读取超时 |
setExpectDataType | http.HttpDataType | 设置指定回来数据的类型 |
setUsingCache | boolean | 运用缓存,默以为true |
setPriority | number | 设置优先级默以为1 |
setUsingProtocol | http.HttpProtocol | 协议类型默许值由体系主动指定 |
setResultTag | Array | 接口回来数据参数,比方data,items等等 |
setContext | Context | 设置上下文,用于下载文件 |
setCustomDialogController | CustomDialogController | 传递的dialog控制器,用于展现dialog |
代码调用如下:
const data = await Net.get("url")
.setHeaders({})//独自增加恳求头参数
.setBaseUrl("")//独自替换BaseUrl
.setParams({})//独自增加参数
.setConnectTimeout(10000)//独自设置衔接超时
.setReadTimeout(10000)//独自设置读取超时
.setExpectDataType(http.HttpDataType.OBJECT)//设置指定回来数据的类型
.setUsingCache(true)//运用缓存,默以为true
.setPriority(1)//设置优先级 默以为1
.setUsingProtocol(http.HttpProtocol.HTTP1_1)//协议类型默许值由体系主动指定
.setResultTag([""])//接口回来数据参数,比方data,items等等
.setContext(this.context)//设置上下文,用于上传文件和下载文件
.setCustomDialogController()//传递的dialog控制器,用于展现dialog
.returnData<TestModel>()
//data为 回来的 TestModel目标
六、装修器恳求介绍
网络库答应运用装修器的办法建议恳求,也便是经过注解的办法,目前采纳的是装修器办法的办法。
1、恳求阐明
装修器和同步异步有所区别,只回来两种数据类型,一种是json字符串,一种是json目标,暂时不供给回来data层数据。在运用的时分,您能够独自创立工具类或许ViewModel或许直接运用,都能够。
回来json字符串
@GET("url")
private getData():Promise<string> {
return null
}
回来json目标
@GET("url")
private getData():Promise<TestModel> {
return null
}
2、get恳求
@GET("url")
private getData():Promise<TestModel> {
return null
}
3、post恳求
@POST("url")
private getData():Promise<TestModel> {
return null
}
4、delete恳求
@DELETE("url")
private getData():Promise<TestModel> {
return null
}
5、put恳求
@PUT("url")
private getData():Promise<TestModel> {
return null
}
6、其他恳求办法
除了常见的恳求之外,依据体系api所供给的,也封装了如下的恳求办法,只需求更改恳求办法即可,比方@OPTIONS。
OPTIONS
HEAD
TRACE
CONNECT
当然,我们也能够运用一致的NET装修器,只不过需求自己设置恳求办法,代码如下:
@NET("url", { method: http.RequestMethod.POST })
private getData():Promise<string> {
return null
}
7、装修器参数传递
直接参数传递
直接参数,在调用装修器恳求时,后面增加即可,一般针对固定参数。
@GET("url", {
baseUrl: "", //baseUrl
header: {}, //头参数
params: {}, //入参
connectTimeout: 1000, //衔接超时
readTimeout: 1000, //读取超时
isReturnJson: true//默许false 回来Json字符串,默许回来json目标
})
private getData():Promise<string> {
return null
}
动态参数传递
动态参数合适参数可变的状况下传递,比方分页等状况。
@GET("url")
private getData(data? : HttpOptions):Promise<string> {
return null
}
调用时传递
private async doHttp(){
const data = await this.getData({
baseUrl: "", //baseUrl
header: {}, //头参数
params: {}, //入参
connectTimeout: 1000, //衔接超时
readTimeout: 1000, //读取超时
isReturnJson: true//默许false 回来Json字符串,默许回来json目标
})
}
装修器参数传递
运用DATA装修器,DATA有必要在上!
@DATA({
baseUrl: "", //baseUrl
header: {}, //头参数
params: {}, //入参
connectTimeout: 1000, //衔接超时
readTimeout: 1000, //读取超时
isReturnJson: true//默许false 回来Json字符串,默许回来json目标
})
@GET("url")
private getData():Promise<string> {
return null
}
七、上传下载介绍
1、上传文件
Net.uploadFile("")//上传的地址
.setUploadFiles([])//上传的文件 [{ filename: "test", name: "test", uri: "internal://cache/test.jpg", type: "jpg" }]
.setUploadData([])//上传的参数 [{ name: "name123", value: "123" }]
.setProgress((receivedSize, totalSize) => {
//监听上传进展
})
.request((data) => {
if (data == UploadTaskState.COMPLETE) {
//上传完结
}
})
办法介绍
办法 | 类型 | 概述 |
---|---|---|
uploadFile | string | 上传的地址 |
setUploadFiles | Array | 上传的文件数组 |
setUploadData | Array | 上传的参数数组 |
setProgress | 回调函数 | 监听进展,receivedSize下载大小,totalSize总大小 |
request | 无 | 恳求上传,data类型为UploadTaskState,有三种状况:START(开端),COMPLETE(完结),ERROR(过错) |
其他办法
删去上传进展监听
uploadRequest.removeProgressCallback()
删去上传使命
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) => {
//监听下载进展
})
.request((data) => {
if (data == DownloadTaskState.COMPLETE) {
//下载完结
}
})
办法介绍
办法 | 类型 | 概述 |
---|---|---|
downLoadFile | string | 下载的地址 |
setContext | Context | 上下文 |
setFilePath | string | 下载后保存的路径 |
setProgress | 回调函数 | 监听进展,receivedSize下载大小,totalSize总大小 |
request | 无 | 恳求下载,data类型为DownloadTaskState,有四种状况:START(开端),COMPLETE(完结),PAUSE(暂停),REMOVE(结束) |
其他办法
移除下载的使命
downLoadRequest.deleteDownloadTask((result) => {
if (result) {
//移除成功
} else {
//移除失利
}
})
暂停下载使命
downLoadRequest.suspendDownloadTask((result) => {
if (result) {
//暂停成功
} else {
//暂停失利
}
})
重新启动下载使命
downLoadRequest.restoreDownloadTask((result) => {
if (result) {
//成功
} else {
//失利
}
})
删去监听下载进展
downLoadRequest.removeProgressCallback()
八、Dialog加载运用

1、界说dialog控制器
NetLoadingDialog是net包中自带的,菊花状弹窗,假如和实际事务不一致,能够替换。
private mCustomDialogController = new CustomDialogController({
builder: NetLoadingDialog({
loadingText: '请等候...'
}),
autoCancel: false,
customStyle: true
})
2、调用传递控制器办法
此办法会主动显示和隐藏dialog,假如觉得不合适,我们能够自己界说即可。
setCustomDialogController(this.mCustomDialogController)
九、相关总结
开发环境如下:
DevEcoStudio4.0Beta2,BuildVersion:4.0.0.400
Api版别:9
hvigorVersion:3.0.2
目前呢,暂时不支撑缓存,后续会逐步加上,我们在运用的过程中,需求任何的问题,都能够进行反馈,都会第一时间进行处理。