一个基于RPC(鸿蒙远场通讯服务)的网络框架

28 阅读3分钟
# @koo/net

## 介绍

@koo/net是一个功能丰富且易用的OpenHarmony/HarmonyOS网络访问库,通过对鸿蒙官方远场通讯服务网络框架的封装,旨在帮助开发者快速、便捷地完成各类网络请求任务。
极大简化了用户的网络访问流程。

## 安装教程
ohpm 安装
```
ohpm install @koo/net
```

## 所需权限
```
ohos.permission.INTERNET
ohos.permission.GET_NETWORK_INFO
```

## 使用说明

### 在工程级别oh-package.json5依赖@koo/net最新版本
- 引入依赖
```
'@koo/net': '1.0.3' //请填入最新版本号。
```

### 在EntryAbility.ets中初始化
- 导包
```typescript
import { HeaderInterceptor, LogInterceptor, NetConfig, NetUtils, NetWorkManager, ParamsInterceptor } from '@koo/net';
```
- 配置
```typescript
let config:NetConfig = new NetConfig()
//默认请求头
let header=new Map<string,string>()
header.set("content-type","application/x-www-form-urlencoded")
header.set("user-agent","Mozilla/5.0 (Linux; Android 12; GOT-W09 Build/HUAWEIGOT-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.88 Safari/537.36")
header.set('screensize','1600*2560')
header.set('curappid','381')
header.set('channel','guanfang')
header.set('version','4.3.6')
header.set('vcode','436')
header.set('macaddr','02:00:00:00:00:00')
header.set('platform','android_pad_12')
header.set('pversion','1.1')
header.set('appname','ieltspro')
header.set('vendor','ieltspro')
header.set('imei', '50e52c28135455bd')
header.set('model', 'HUAWEI,GOT-W09')
//将默认请求头配置给config
config.header=header
//设置连接超时时间
config.connectTimeout=15000;
//设置从服务器获取数据超时时间
config.readTimeout=15000;
//设置往服务器写入数据超时时间
config.writeTimeout=15000
//设置基础url,请填写您自己的网址
config.baseUrl='https://mobi.xxx.xxx.com';
```
- 初始化请求头拦截器
```typescript
//请求头拦截器,暂时还没想到要干什么
let headerIntercept:HeaderInterceptor= {
  onIntercept: (header?: Map<string, string>) => {
  }
}
```
- 初始化请求参数拦截器
```typescript
//请求参数拦截器,用于拦截入参,用于处理你想对请求参数进行改动。
let paramsIntercept:ParamsInterceptor= {
  onIntercept: async (params: Map<string, string>): Promise<string> => {
    
    return ""
  }
}

```
- 日志拦截器
```typescript
//日志拦截器,还没想到要干什么
let logIntercept:LogInterceptor= {
  onIntercept: (header: Map<string, string>): void => {
  }
}
```
- 初始化网络框架

将上面初始化的数据类放入网络框架进行整体的初始化。
```typescript
//初始化网络框架,只需要init一次。
NetWorkManager.getInstance().init(config,headerIntercept,paramsIntercept,logIntercept)
```

- 使用本框架发起网络请求
```typescript
async requestData(){
  //创建请求入参
  let params=new Map<string,string>();
  params.set("sid","631e64fa6a756033186858d02a66ab5b7819a4105c17d5d2")
  let a = await NetWorkManager.getInstance().post<ResponseBean>("/api/ielts/app/studyResult/getUserLastStudyInfo",params);
  if(a.isSuccess()){
    console.log("---->接口请求回来了,结果是code="+a.resp?.code+"  message="+a.resp?.message+"  popupTitle="+a.resp?.obj?.popupTitle+"  lableName="+a.resp?.obj?.questionInfo?.labelName);
  }else{
    console.log("---->请求错误,原因是="+a.error?.data)
  }
}
```
`BaseBean<ResponseBean>填写您自己的Bean类即可,请求成功后返回的就是您设置的Bean类的对象`
- Bean示例
```typescript
//最外层的大Bean,包含成功resp(json解析后的),错误Bean,以及是否请求成功的判断
export class BaseResp<T>{
  resp?:BaseBean<T>
  netError?:NetError.NetErrorBean;
  serverError?:ServerError.ServerErrorBean;

  isServerError():boolean{
    return this.serverError!=null;
  }

  isNetError():boolean{
    return this.netError!=null;
  }

  isSuccess():boolean{
    return this.resp!=null;
  }
}
//外层包装Bean主要是封装服务器返回的错误码,message信息,以及具体数据
export class BaseBean<T>{
  code:number=-1
  message:string=""
  obj?:T|null=null
}
//服务器返回的具体信息(此处根据您具体业务逻辑实现)。
export class ResponseBean{
  popupTitle:string=""
  popupType:string=""
  questionInfo?:QuestionInfo
}
//服务器返回的具体信息,子Bean,为了演示嵌套Bean解析情况(此处根据您具体业务逻辑实现)。
export class QuestionInfo{
  labelName:String=""
}
```
- 错误码解析,此处给出了几简单个错误示例,有需要可以再次添加。
```typescript
    //无法域名解析失败
    ERROR_FAILED_RESOLVE = 9000,
    //无法连接到服务器
    ERROR_FAILED_CONNECT = 9001,
    //操作超时
    ERROR_TIMEOUT = 9002,
    //未知错误
    ERROR_UNKNOW = 10000
```
`使用时当返回的isSuccess为false时即可根据此处错误码判断具体错误类型。`