前言

网络封装的目的,在于简练,运用起来更加的便利,也易于我们进行相关动作的设置,假如,我们不封装,那么每次恳求,就会重复大量的代码逻辑,如下代码,是官方给出的案例:

// 引入包名
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目录,仿制进去

HarmonyOS开发:依据http开源一个网络恳求库

引入之后,进行同步项目,点击SyncNow即可,当然了你也能够,将鼠标放置在报错处会呈现提示,在提示框中点击Run’ohpminstall‘。

需求留意,@app/net,是用来区别目录的,能够自己界说,比方@aa/bb等,关于静态同享包的创立和运用,请检查如下我的介绍,这儿就不过多介绍。

HarmonyOS开发:走进静态同享包的依靠与运用

检查是否引用成功

无论运用哪种办法进行依靠,终究都会在运用的模块中,生成一个oh_modules文件,并创立源代码文件,有则成功,无则失利,如下:

HarmonyOS开发:依据http开源一个网络恳求库

三、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加载运用

HarmonyOS开发:依据http开源一个网络恳求库

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

目前呢,暂时不支撑缓存,后续会逐步加上,我们在运用的过程中,需求任何的问题,都能够进行反馈,都会第一时间进行处理。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。