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