【鸿蒙实战开发】基于rcp的网络请求能力

101 篇文章 0 订阅
101 篇文章 0 订阅

rcp模块提供HTTP数据请求功能,请求性能如接口的易用性、性能、功耗方面,对比Network Kit HTTP网络API,rcp采用面向对象和场景的设计,API使用更简单、更灵活,满足不同场景的使用需求,具备更好的扩展性和更优的性能。支持如场景化网络API、网络代理、自定义DNS解析、自定义证书校验、服务器身份校验等特性。

场景描述

RCP网络库提供数据请求功能 涉及到的使用场景可参考如下:

场景一:调用rcp库实现基础的网络请求能力
场景二:对标http原生库能力 使用post、get请求将多个文件采用表单形式上传至服务端做处理
场景三:当根证书校验失败,请求使用自签名证书不支持/无法通过校验 或 证书过期需要重新修改证书时,通过rcp网络请求能力忽略证书校验
场景四:为验证服务端和客户端之间的身份和数据完整性,确保通信的安全性
场景五:不同的系统、不同的框架使用的域名解析机制不同,用户使用域名连接系统时,需要配置使用统一解析域名作为入口处理请求
场景六: 请求时判断用户是否登录、判断用户是否有权限访问资源、处理cookie方式,调用rcp请求实现拦截器能力

方案描述

场景一:

调用rcp库实现基础的网络请求能力

效果图

方案

创建session会话后,调用模块支持的各类HTTP数据发送方式(FETCH、GET、POST、PUT等),有关能力可参考文档: rcp.session

核心代码

rcpTest(){

let testUrl = "https://www.xxx.com"

//定义通信会话对象

const sessionWithSecurityConfig = rcp.createSession();

//get请求

sessionWithSecurityConfig.get(testUrl).then((response) => {

console.log("test---------" + response.toString());

//页面展示请求结果

AlertDialog.show(

{

title: 'request接口回调结果',

message: '请求网站:' + testUrl + '\n\n' + 'Callback Data: ' + response.toString(),

})

}).catch((err:BusinessError)=> {

AlertDialog.show(

{

title: 'request接口回调结果',

message: '请求失败,错误信息:' + err.data,

})

console.error("test err:" + JSON.stringify(err));

});

}

场景二:

使用时希望通过post、get请求将多个文件采用表单形式携带上传至服务端做对应处理

方案

请求地址采用post方式上传文件时需要携带多个文件,可通过MultipartForm多表单参数实现当前场景

核心代码

let session = rcp.createSession();

let request = new rcp.Request('http://192.168.0.1:8080');

request.content = new rcp.MultipartForm({

file1: {

contentOrPath: {

content: new util.TextEncoder().encode('Text').buffer

}

},

file2: {

contentOrPath: {

content: new util.TextEncoder().encode('Text').buffer

}

},

});

try {

const resp = await session.fetch(request);

console.log("resp",JSON.stringify(resp))

expect(resp.statusCode).assertEqual(200);

} catch (e) {

expect(JSON.stringify(e)).assertEqual('99');

}

session.close();

场景三:

当根证书校验失败,请求使用自签名证书不支持/无法通过校验 或 证书过期需要重新修改证书时,希望通过rcp网络请求能力忽略证书校验

效果图

方案

rcp网络库中可通过设置参数Configuration.security设置为 ‘skip’ 以绕过证书校验,可参考文档: rcp.requestConfiguration

核心代码


let testUrl = "https://www.example.com"

//session中证书有关能力设置

const securityConfig: rcp.SecurityConfiguration = {

remoteValidation : 'skip'

};

//发起请求

const session = rcp.createSession({ requestConfiguration: { security: securityConfig } });

session.get(testUrl).then((response) => {

console.log('res timeInfo : ' + JSON.stringify(response));

}).catch((err: BusinessError) => {

console.error("err:" + JSON.stringify(err));

});

场景四:

为验证服务端和客户端之间的身份和数据完整性,确保通信的安全性,使用rcp库能力实现双向证书绑定能力

效果图

方案

为实现双向证书绑定能力需要首先对服务端证书做校验,请求同时需要客户端证书做校验 可在Configuration接口包含配置参数 rcp.Configuration

核心代码


//证书内容读取

getContext(this).area = 0

let context: Context = getContext(this);

const keyPemConent = context.resourceManager.getRawFileContentSync('baidu.pem')

//通信url地址

let kHttpServerAddress = "https://www.baidu.com";

try {

//建立通信请求

const session = rcp.createSession();

const request = new rcp.Request(kHttpServerAddress, "GET");

//设置请求参数

request.configuration = {

security: {

certificate: {

content: keyPemConent,

type: "PEM"

}

}

}

console.info("configuration:" + JSON.stringify(request.configuration));

//fetch方式获取请求结果

const response = await session.fetch(request);

console.info("证书校验成功", JSON.stringify(response));

let content1 = `${kHttpServerAddress} 证书校验成功` + JSON.stringify(response);

} catch (err) {

console.error("证书校验失败" + JSON.stringify(err));

let content1 = `${kHttpServerAddress} 证书校验失败` + JSON.stringify(err);

let e: BusinessError = err as BusinessError;

console.error("testTag Get push token catch error:" + JSON.stringify(e));

}

场景五:

不同的系统、不同的框架使用的域名解析机制不同,用户使用域名连接系统时,需要配置使用统一解析域名作为入口处理请求

方案

如开发人员需要为HTTP请求配置域名系统(DNS),包括自定义DNS服务器或静态DNS规则,可在session对象中的DnsConfiguration参数处设置

核心代码


// 1、自定义DNS服务器

const customDnsServers: rcp.DnsServers = [

{ ip: "8.8.8.8" },

{ ip: "8.8.4.4", port: 53 },

];

const sessionWithCustomDns = rcp.createSession({ requestConfiguration: { dns: { dnsRules: customDnsServers } } });

// 2、自定义静态DNS能力

const staticDnsRules: rcp.StaticDnsRules = [

{ host: "example.com", port: 80, ipAddresses: ["192.168.1.1", "192.168.1.2"] },

{ host: "sub.example.com", port: 443, ipAddresses: ["192.168.2.1"] },

];

const sessionWithStaticDns = rcp.createSession({ requestConfiguration: { dns: { dnsRules: staticDnsRules } } });

// 3、配置HTTP请求的DNS

const dohConfig: rcp.DnsOverHttpsConfiguration = {

url: "https://dns.example.com/dns-query",

skipCertificatesValidation: true,

};

const sessionWithDoh = rcp.createSession({ requestConfiguration: { dns: { dnsOverHttps: dohConfig } } });

场景六:

请求时判断用户是否登录、判断用户是否有权限访问资源、处理cookie方式,调用rcp请求实现拦截器能力

方案

当前Api12配套版本上,rcp库中添加interceptors参数做对应的拦截器功能,有关参数说明可参考 rcp.Interceptor

核心代码


//定义拦截器

class ResponseCache {

private readonly cache: any = {};

getResponse(url: string): rcp.Response {

return this.cache[url];

}

setResponse(url: string, response: rcp.Response): void {

this.cache[url] = response;

}

}

class ResponseCachingInterceptor implements rcp.Interceptor {

constructor(private readonly cache: ResponseCache) {}

async intercept(context: rcp.RequestContext, next: rcp.RequestHandler): Promise<rcp.Response> {

const url = context.request.url.href;

const responseFromCache = this.cache.getResponse(url);

if (responseFromCache) {

return Promise.resolve(responseFromCache);

}

const promise = next.handle(context);

promise.then((resp)=>{

resp.statusCode = 200;

cache.setResponse(url, resp);

});

return promise;

}

}

//使用rcp库拦截器能力

const cache = new ResponseCache();

async function testInterceptor() {

const session = rcp.createSession({

interceptors: [new ResponseCachingInterceptor(cache)]

});

const response1 = await session.get('https://www.example.com');

const response2 = await session.fetch(request);

}

鸿蒙全栈开发全新学习指南

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以要有一份实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档用来跟着学习是非常有必要的。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

本路线共分为四个阶段

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值