【最新鸿蒙应用开发】——NAPI的通信服务

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的主要业务流程如下:

  1. 应用客户端创建会话。

  2. 应用客户端发起请求。

  3. 应用客户端接收请求结果,处理相应业务。

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请求。

  1. 导入模块。

    import { rcp } from "@kit.RemoteCommunicationKit";
    import { BusinessError } from '@kit.BasicServicesKit';

  2. 发起请求。"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

客户端请求发送数据到服务器。

  1. 导入模块。

    import { rcp } from "@kit.RemoteCommunicationKit";
    import { BusinessError } from '@kit.BasicServicesKit';

  2. 发起请求。"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属性,截取下载内容,并拼接到文件。

  1. 导入模块。

    import { rcp } from "@kit.RemoteCommunicationKit";
    import { BusinessError } from '@kit.BasicServicesKit';

  2. 发起请求。"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. 双向证书校验

用于验证服务端和客户端之间的身份和数据完整性,确保通信的安全性。

  1. 导入模块。

    import { rcp } from "@kit.RemoteCommunicationKit";
    import { fileIo } from "@kit.CoreFileKit";
    import { BusinessError } from '@kit.BasicServicesKit';

  2. 读取证书。

    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));
      }
    }

  3. 发起请求。"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));
      }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值