1. Remote Communication Kit简介
Remote Communication Kit(远场通信服务)是华为提供的HTTP发起数据请求的NAPI封装。应用通过Remote Communication Kit可便捷快速地向服务器发起数据请求。
1.1. 基本概念
HTTP(Hypertext Transfer Protocol)是一种用于传输数据的协议,它是基于客户端-服务器模型的,客户端向服务器发出请求,服务器返回响应。HTTP请求是客户端向服务器发送请求的过程,包括以下基本概念:
-
请求方法(Request Method):客户端向服务器发送请求的方式,如GET、POST、PUT、DELETE、OPTIONS、HEAD、PATCH等。
-
URL(Uniform Resource Locator):统一资源定位符,用于指定要访问的资源的地址。
-
请求头(Request Header):包含一些附加的信息,如请求的来源、客户端的浏览器类型、语言、字符集等。
-
请求体(Request Body):包含客户端向服务器发送的数据,如表单数据等。
-
HTTP版本(HTTP Version):HTTP协议的版本号,如HTTP/1.1、HTTP/2等。
-
状态码(Status Code):服务器响应请求后返回的状态码,如200表示请求成功;404表示请求的资源不存在等。
-
响应头(Response Header):包含一些附加的信息,如服务器的类型、响应的日期、内容类型等。
-
响应体(Response Body):包含服务器返回给客户端的数据,如HTML、JSON等格式的数据。
1.2. 场景介绍
HTTP支持以下请求类型:
请求类型 | 说明 |
---|---|
GET | 获取资源,用于请求特定资源的表示形式。 常用场景:用于获取资源,如网页、图片、视频等。 |
POST | 提交资源,用于提交实体,通常作为表单提交的一部分。 常用场景:用于提交数据,如表单数据、上传文件等。 |
OPTIONS | 获取资源支持的HTTP方法,用于请求有关目标资源的通信选项。 常用场景:用于获取资源支持的HTTP方法,如获取某个API支持的请求方式。 |
HEAD | 获取资源的元数据,与GET方法类似,但不返回资源的主体部分,只返回资源的元数据,如响应头。 常用场景:用于获取资源的头部信息,如文件大小、修改时间等。 |
PUT | 更新资源,用于修改已经存在服务器上的资源。对指定URL路径上的资源进行完全替换。 常用场景:用于更新资源,如更新文件、修改数据库记录等。 |
DELETE | 删除资源,用于删除目标资源。 常用场景:用于删除资源的操作,比如删除用户、删除文章等。 |
PATCH | 更新资源的一部分,用于对资源进行局部修改。 常用场景:更新服务器局部资源,比如资源的某些属性和字段,因此不需要替换整个资源。 |
1.3. 业务流程
使用Remote Communication Kit的主要业务流程如下:
-
应用客户端创建会话。
-
应用客户端发起请求。
-
应用客户端接收请求结果,处理相应业务。
2. 使用
2.1. 申请权限
应用在使用RemoteCommunication Kit能力前,需要检查是否已经获取对应权限。如未获得授权,可以向用户申请所需要的权限。
RemoteCommunication kit所需权限有(除取消网络请求,关闭会话,其余请求都需要权限):
-
ohos.permission.INTERNET:用于应用的权限,决定是否允许应用访问互联网。
-
ohos.permission.GET_NETWORK_INFO:用于获取设备网络信息的 API 。
2.1.1. 申请权限步骤
需要在entry/src/main路径下的module.json5中配置所需申请的权限。示例代码如下所示:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
}
]
}
2.2. 获取服务器资源
2.1.1. get
获取服务器资源,使用GET请求。
-
导入模块。
import { rcp } from "@kit.RemoteCommunicationKit"; import { BusinessError } from '@kit.BasicServicesKit';
-
发起请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession(); session.get("http://www.example.com/get").then((response) => { console.log(JSON.stringify(response)); }).catch((err: BusinessError) => { console.error("err:" + JSON.stringify(err)); });
2.1.2. post
客户端请求发送数据到服务器。
-
导入模块。
import { rcp } from "@kit.RemoteCommunicationKit"; import { BusinessError } from '@kit.BasicServicesKit';
-
发起请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession(); session.post("http://www.example.com/post", "Data").then((response) => { console.log(JSON.stringify(response)); }).catch((err: BusinessError) => { console.error("err:" + JSON.stringify(err)); });
2.3. 断点续传
在多任务并发情况或网络中断需要接续上次任务的情况,用户可定义TransferRange的from和to属性,截取下载内容,并拼接到文件。
-
导入模块。
import { rcp } from "@kit.RemoteCommunicationKit"; import { BusinessError } from '@kit.BasicServicesKit';
-
发起请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession(); let kHttpServerAddress = "http://www.example.com/fetch"; const request = new rcp.Request(kHttpServerAddress, "GET"); request.transferRange = { from: 20, to: 100 }; session.fetch(request).then( (rep: rcp.Response) => { console.info("Response:" + JSON.stringify(rep)); } ).catch((err: BusinessError) => { console.error("Response err:" + JSON.stringify(err)); } ); const resp = session.fetch(request); this.content = `${kHttpServerAddress} 断点续传成功` + JSON.stringify(resp); console.info("断点续传成功" + JSON.stringify(resp)); session.close();
2.4. 双向证书校验
用于验证服务端和客户端之间的身份和数据完整性,确保通信的安全性。
-
导入模块。
import { rcp } from "@kit.RemoteCommunicationKit"; import { fileIo } from "@kit.CoreFileKit"; import { BusinessError } from '@kit.BasicServicesKit';
-
读取证书。
let readSyn = async () => { let pathDir = "/data/storage/el2/base/files/"; let filePath = pathDir + "/client.crt"; console.info("readxx" + filePath); try { fileIo.open(filePath, fileIo.OpenMode.READ_WRITE).then((file: fileIo.File) => { console.info("readxx the file is:" + JSON.stringify(file.fd)); let buf = new ArrayBuffer(4096); try { fileIo.read(file.fd, buf, (err: BusinessError, readLen: number) => { if (err) { console.error("readxx failed with error message:" + JSON.stringify(err)); } else { console.info("readxx file data succeed"); console.info("readxx:" + String.fromCharCode(...new Uint8Array(buf.slice(0, readLen)))); let content = String.fromCharCode(...new Uint8Array(buf.slice(0, readLen))); console.info("this.cert.data:" + JSON.stringify(content)); fileIo.closeSync(file); } }); } catch (err) { console.error("readxx failed errInfo is:" + JSON.stringify(err)); } }) } catch (err) { console.error("readxx Open failed errInfo is:" + JSON.stringify(err)); } }
-
发起请求。"https://www.example.com"请根据实际情况替换为想要请求的URL地址。
let getCertSyn = async (n: string) => { let kHttpServerAddress = "https://www.example.com/fetch"; try { const session = rcp.createSession(); const request = new rcp.Request(kHttpServerAddress, "GET"); request.configuration = { security: { certificate: { content: n, type: "PEM", key: " ", keyPassword: "" } } } console.info("configuration:" + JSON.stringify(request.configuration)); 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)); } }