如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。
1、前言
rcp是HarmonyOS中的远场通信套件(Remote Communication Kit)中提供的一套便捷的HTTP请求模块。我们在开发应用时,可以方便的通过Remote Communication Kit快速地向服务器发起数据请求。
❓ 可能有朋友会问:这个rcp和之前提到的@kit.NetworkKit中的http有啥区别?
答:都是发起HTTP请求的一个方式,但更推荐使用rcp,未来将持续迭代更新这部分内容。
我相信读者对HTTP传输协议已经很熟悉了,目前,HTTP请求方式分为7种,分别是:GET、POST、PUT、DELETE、OPTIONS、PATCH、HEAD。他们的说明简单介绍如下:
请求类型 | 说明 |
GET | 获取资源,用于请求特定资源的表示形式。 【常用场景:用于获取资源,如网页、图片、视频等】 |
POST | 提交资源,用于提交实体,通常用于提交表单数据。 【常用场景:用于提交数据,如表单数据、上传文件等】 |
OPTIONS | 获取资源支持的HTTP方法,用于请求有关目标资源的通信选项。 【常用场景:用于获取资源支持的HTTP方法,如获取某个API支持的请求方式】 |
HEAD | 获取资源的元数据,与GET方法类似,但不返回资源的主体部分,只返回资源的元数据,如响应头。 【常用场景:用于获取资源的头部信息,如文件大小、修改时间等】 |
PUT | 更新资源,用于修改已经存在服务器上的资源。对指定URL路径上的资源进行完全替换。 【常用场景:用于更新资源,如更新文件、修改数据库记录等】 |
DELETE | 删除资源,用于删除目标资源。 【常用场景:用于删除资源的操作,比如删除用户、删除文章等】 |
PATCH | 更新资源的一部分,用于对资源进行局部修改。 【常用场景:更新服务器局部资源,比如资源的某些属性和字段,因此不需要替换整个资源】 |
2、权限
应用在使用RemoteCommunication Kit能力前,需要检查是否已经获取对应权限。如未获得授权,需要声明对应权限。
RemoteCommunication kit所需权限有(除取消网络请求,关闭会话,其余请求都需要权限):
-
ohos.permission.INTERNET:用于应用的权限,决定是否允许应用访问互联网。
-
ohos.permission.GET_NETWORK_INFO:用于获取设备网络信息的 API 。
需要在entry/src/main路径下的module.json5中配置所需申请的权限。示例代码如下所示:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
}
]
}
}
如果是Native API,使用时还需要在CMakeLists.txt中设置动态库路径及头文件路径,并进行链接。
如编译target为entry,则添加如下命令:
target_include_directories(entry PUBLIC ${HMOS_SDK_NATIVE}/sysroot/usr/include)
target_link_directories(entry PUBLIC ${HMOS_SDK_NATIVE}/sysroot/usr/lib/aarch64-linux-ohos)
target_link_libraries(entry PUBLIC librcp_c.so) #链接librcp_c.so及其他依赖的so
3、使用rcp发送HTTP请求
rcp提供了多种发送HTTP请求的方式,常用的有:fetch、get、post、put、head、delete。
另外,还有cancel和close去取消和关闭网络请求。下面针对这几个场景做简单介绍。
👉🏻 fetch发送网络请求
fetch()方法发送HTTP请求时,可以设置请求头和请求体等参数,并返回来自服务器的HTTP响应。使用Promise异步回调。【常用于获取资源,支持流处理和通过拦截器来处理请求和响应】
接口定义为:fetch(request: Request): Promise<Response>
代码示例:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建Request对象。"https://www.example.com"请根据实际情况替换为想要请求的URL地址。
const kHttpServerAddress = "https://www.example.com/fetch";
const request = new rcp.Request(kHttpServerAddress, "GET");
// 创建会话
const session = rcp.createSession();
// 发起请求,并处理结果
session.fetch(request).then((rep: rcp.Response) => {
console.info(`Response succeeded: ${rep}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
👉🏻 get发送网络请求
使用get()方法可以发送一个get请求。接口定义如下:
get(url: URLOrString, destination?: ResponseBodyDestination): Promise<Response>
代码示例:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
//创建会话,会话发起get请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
session.get("http://www.example.com/get").then((response) => {
console.info(`Response succeeded: ${response}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
👉🏻 post发送网络请求
发送一个带有默认HTTP参数的HTTP POST请求,并返回来自服务器的HTTP响应。使用Promise异步回调。常用于向服务器提交数据。与GET请求不同,POST请求将参数包含在请求主体中,适用于创建新资源、提交表单数据或执行某些操作。接口定义如下:
post(url: URLOrString, content?: RequestContent, destination?: ResponseBodyDestination): Promise<Response>
代码示例:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建会话,会话发起post请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
session.post("http://www.example.com/post", "data to send").then((response) => {
console.info(`Response succeeded: ${response}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
👉🏻 put发送网络请求
发送一个带有默认HTTP参数的HTTP PUT请求,并返回来自服务器的HTTP响应。使用Promise异步回调。常用于向服务器更新资源。PUT请求将更新的数据发送到特定的URL,用于替换指定资源的全部内容。接口定义如下:
put(url: URLOrString, content?: RequestContent, destination?: ResponseBodyDestination): Promise<Response>
代码示例:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建会话,会话发起put请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
session.put("http://www.example.com/put", "data to send").then((response) => {
console.info(`Response succeeded: ${response}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
👉🏻 head发送网络请求
发送一个带有默认HTTP参数的HTTP HEAD请求,并返回来自服务器的HTTP响应。使用Promise异步回调。类似GET请求,但只返回相应头,不返回实体内容。可以获取资源的元信息,如文件大小、修改日期等。接口定义如下:
head(url: URLOrString): Promise<Response>
示例代码如下:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建会话,会话发起head请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
session.head("http://www.example.com/head").then((response) => {
console.info(`Response succeeded: ${response}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
👉🏻 delete发送网络请求
发送一个带有默认HTTP参数的HTTP DELETE请求,并返回来自服务器的HTTP响应。使用Promise异步回调。用于从服务器删除资源。通过向指定URL发送DELETE请求,可以删除该URL上对应的资源。接口定义如下:
delete(url: URLOrString): Promise<Response>
代码示例:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
//创建会话,会话发起delete请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
session.delete("http://www.example.com/delete").then((response) => {
console.info(`Response succeeded: ${response}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
👉🏻 cancel取消发送网络请求
接口定义如下:
cancel(requestToCancel?: Request| Request[]): void
示例代码如下:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建会话,会话发起请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
let req = new rcp.Request("http://www.example.com/fetch", "GET");
session.fetch(req).then((response) => {
console.info(`Response succeeded: ${response}`);
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
});
// 取消请求
session.cancel(req);
👉🏻 close关闭请求
通信请求结束后,需要关闭会话。调用此方法以释放与此会话关联的资源。接口定义如下:
close(): void
示例代码:
// 导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建会话,会话发起请求后关闭会话。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。
const session = rcp.createSession();
let req = new rcp.Request("http://www.example.com/fetch", "GET");
session.fetch(req).then((response) => {
console.info(`Response succeeded: ${response}`);
session.close();
}).catch((err: BusinessError) => {
console.error(`Response err: Code is ${err.code}, message is ${JSON.stringify(err)}`);
session.close();
});