鸿蒙网络管理模块01——HTTP与WebSocket请求数据

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

鸿蒙的网络管理模块主要提供以下功能:

  • HTTP数据请求:通过HTTP发起一个数据请求。

  • WebSocket连接:使用WebSocket建立服务器与客户端的双向连接。

  • Socket连接:通过Socket进行数据传输。

需要注意的是,使用网络管理模块相关功能时,需要申请相应的权限。

  • ohos.permission.GET_NETWORK_INFO

获取网络连接信息

  • ohos.permission.SET_NETWORK_INFO

修改网络连接状态

  • ohos.permission.INTERNET

运行程序进行网络连接

本文先介绍发起HTTP数据请求与WebSocket连接。

2、发起HTTP数据请求

使用该功能需要申请ohos.permission.INTERNET权限

对于HTTP请求而言,常见的有GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT等请求方法。

主要涉及的接口有:

图片

👉🏻 一般情况下,使用request接口,具体开发步骤如下:

图片

实例demo如下:

// 引入包名import { http } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';// 每一个httpRequest对应一个HTTP请求任务,不可复用let httpRequest = http.createHttp();// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。8+httpRequest.on('headersReceive', (header) => {  console.info('header: ' + JSON.stringify(header));});httpRequest.request(  // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定  "EXAMPLE_URL",  {    method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET    // 开发者根据自身业务需要添加header字段    header: {      'Content-Type': 'application/json'    },    // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定    extraData: "data to send",    expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型    usingCache: true, // 可选,默认为true    priority: 1, // 可选,默认为1    connectTimeout: 60000, // 可选,默认为60000ms    readTimeout: 60000, // 可选,默认为60000ms    usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定    usingProxy: false, // 可选,默认不使用网络代理,自API 10开始支持该属性    caPath:'/path/to/cacert.pem', // 可选,默认使用系统预制证书,自API 10开始支持该属性    clientCert: { // 可选,默认不使用客户端证书,自API 11开始支持该属性      certPath: '/path/to/client.pem', // 默认不使用客户端证书,自API 11开始支持该属性      keyPath: '/path/to/client.key', // 若证书包含Key信息,传入空字符串,自API 11开始支持该属性      certType: http.CertType.PEM, // 可选,默认使用PEM,自API 11开始支持该属性      keyPassword: "passwordToKey" // 可选,输入key文件的密码,自API 11开始支持该属性    },    multiFormDataList: [ // 可选,仅当Header中,'content-Type'为'multipart/form-data'时生效,自API 11开始支持该属性      {        name: "Part1", // 数据名,自API 11开始支持该属性        contentType: 'text/plain', // 数据类型,自API 11开始支持该属性        data: 'Example data', // 可选,数据内容,自API 11开始支持该属性        remoteFileName: 'example.txt' // 可选,自API 11开始支持该属性      }, {        name: "Part2", // 数据名,自API 11开始支持该属性        contentType: 'text/plain', // 数据类型,自API 11开始支持该属性        // data/app/el2/100/base/com.example.myapplication/haps/entry/files/fileName.txt        filePath: `${getContext(this).filesDir}/fileName.txt`, // 可选,传入文件路径,自API 11开始支持该属性        remoteFileName: 'fileName.txt' // 可选,自API 11开始支持该属性      }    ]  }, (err: BusinessError, data: http.HttpResponse) => {    if (!err) {      // data.result为HTTP响应内容,可根据业务需要进行解析      console.info('Result:' + JSON.stringify(data.result));      console.info('code:' + JSON.stringify(data.responseCode));      // data.header为HTTP响应头,可根据业务需要进行解析      console.info('header:' + JSON.stringify(data.header));      console.info('cookies:' + JSON.stringify(data.cookies)); // 8+      // 当该请求使用完毕时,调用destroy方法主动销毁      httpRequest.destroy();    } else {      console.error('error:' + JSON.stringify(err));      // 取消订阅HTTP响应头事件      httpRequest.off('headersReceive');      // 当该请求使用完毕时,调用destroy方法主动销毁      httpRequest.destroy();    }  });

除了普通的request()接口外,API 10 及以后我们还可以使用requestInStream()接口,来实现网络请求的流式响应。

👉🏻 开发步骤如下:

图片

实例代码如下:​​​​​​​

// 引入包名import { http } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';// 每一个httpRequest对应一个HTTP请求任务,不可复用let httpRequest = http.createHttp();// 用于订阅HTTP响应头事件httpRequest.on('headersReceive', (header: Object) => {  console.info('header: ' + JSON.stringify(header));});// 用于订阅HTTP流式响应数据接收事件let res = new ArrayBuffer(0);httpRequest.on('dataReceive', (data: ArrayBuffer) => {   const newRes = new ArrayBuffer(res.byteLength + data.byteLength);   const resView = new Uint8Array(newRes);   resView.set(new Uint8Array(res));   resView.set(new Uint8Array(data), res.byteLength);   res = newRes;   console.info('res length: ' + res.byteLength);});// 用于订阅HTTP流式响应数据接收完毕事件httpRequest.on('dataEnd', () => {  console.info('No more data in response, data receive end');});// 用于订阅HTTP流式响应数据接收进度事件class Data {  receiveSize: number = 0;  totalSize: number = 0;}httpRequest.on('dataReceiveProgress', (data: Data) => {  console.log("dataReceiveProgress receiveSize:" + data.receiveSize + ", totalSize:" + data.totalSize);});let streamInfo: http.HttpRequestOptions = {  method: http.RequestMethod.POST,  // 可选,默认为http.RequestMethod.GET  // 开发者根据自身业务需要添加header字段  header: {    'Content-Type': 'application/json'  },  // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定  extraData: "data to send",  expectDataType:  http.HttpDataType.STRING,// 可选,指定返回数据的类型  usingCache: true, // 可选,默认为true  priority: 1, // 可选,默认为1  connectTimeout: 60000, // 可选,默认为60000ms  readTimeout: 60000, // 可选,默认为60000ms。若传输的数据较大,需要较长的时间,建议增大该参数以保证数据传输正常终止  usingProtocol: http.HttpProtocol.HTTP1_1 // 可选,协议类型默认值由系统自动指定}// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定httpRequest.requestInStream("EXAMPLE_URL", streamInfo).then((data: number) => {  console.info("requestInStream OK!");  console.info('ResponseCode :' + JSON.stringify(data));  // 取消订阅HTTP响应头事件  httpRequest.off('headersReceive');  // 取消订阅HTTP流式响应数据接收事件  httpRequest.off('dataReceive');  // 取消订阅HTTP流式响应数据接收进度事件  httpRequest.off('dataReceiveProgress');  // 取消订阅HTTP流式响应数据接收完毕事件  httpRequest.off('dataEnd');  // 当该请求使用完毕时,调用destroy方法主动销毁  httpRequest.destroy();}).catch((err: Error) => {  console.info("requestInStream ERROR : err = " + JSON.stringify(err));});

3、WebSocket连接

使用WebSocket建立服务器与客户端的双向连接,需要先通过createWebSocket()方法创建WebSocket对象,然后通过connect()方法连接到服务器。当连接成功后,客户端会收到open事件的回调,之后客户端就可以通过send()方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到message事件的回调。当客户端不要此连接时,可以通过调用close()方法主动断开连接,之后客户端会收到close事件的回调。

【使用该功能需要申请ohos.permission.INTERNET权限】

【若在上述任一过程中发生错误,客户端会收到error事件的回调】

WebSocket连接功能主要由webSocket模块提供,具体接口说明如下:

图片

一般情况下,常见的开发步骤如下:

  1. 导入需要的webSocket模块。

  2. 创建一个WebSocket连接,返回一个WebSocket对象。

  3. (可选)订阅WebSocket的打开、消息接收、关闭、Error事件。

  4. 根据URL地址,发起WebSocket连接。

  5. 使用完WebSocket连接之后,主动断开连接。

import { webSocket } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';let defaultIpAddress = "ws://";let ws = webSocket.createWebSocket();ws.on('open', (err: BusinessError, value: Object) => {  console.log("on open, status:" + JSON.stringify(value));  // 当收到on('open')事件时,可以通过send()方法与服务器进行通信  ws.send("Hello, server!", (err: BusinessError, value: boolean) => {    if (!err) {      console.log("Message sent successfully");    } else {      console.log("Failed to send the message. Err:" + JSON.stringify(err));    }  });});ws.on('message', (err: BusinessError, value: string | ArrayBuffer) => {  console.log("on message, message:" + value);  // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接  if (value === 'bye') {    ws.close((err: BusinessError, value: boolean) => {      if (!err) {        console.log("Connection closed successfully");      } else {        console.log("Failed to close the connection. Err: " + JSON.stringify(err));      }    });  }});ws.on('close', (err: BusinessError, value: webSocket.CloseResult) => {  console.log("on close, code is " + value.code + ", reason is " + value.reason);});ws.on('error', (err: BusinessError) => {  console.log("on error, error:" + JSON.stringify(err));});ws.connect(defaultIpAddress, (err: BusinessError, value: boolean) => {  if (!err) {    console.log("Connected successfully");  } else {    console.log("Connection failed. Err:" + JSON.stringify(err));  }});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1553195.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、模运算、模运算性质、栈

PDF文档回复:20241002 **1 P1981 [NOIP2013普及组] 表达式求值 ** [题目描述] 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值 [输入格式] 一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “” 和乘法运算符 …

Stream流的中间方法

一.Stream流的中间方法 注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程 注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据 二.filter filter的主要用法是…

SpringCloud-基于Docker和Docker-Compose的项目部署

一、初始化环境 1. 卸载旧版本 首先,卸载可能已存在的旧版本 Docker。如果您不确定是否安装过,可以直接执行以下命令: sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…

十一不停歇-学习ROS2第一天 (10.2 10:45)

话题通信 1.1 发布第一个节点: import rclpy #导入此类模块 rcl类型 from rclpy.node import Node #从这个子模块中导入这类函数 def main(): #定义这个函数 rclpy.init() #使用初始化函数 node Node(hello_python) 将类函数里面的内容调给…

基于SpringBoot原创歌曲分享平台设计与实现

1.1课题背景 随着科学技术发展,电脑已成为人们生活中必不可少的生活办公工具,在这样的背景下,网络技术被应用到各个方面,为了提高办公生活效率,网络信息技术飞速发展。在这样的背景下人类社会进入了全新的信息化的时代…

【CT511N-A(T0)大夏龙雀4G模块】GPS定位实操和各个参数解释(详细简单,一看就懂)

总览 1.前言 2.硬件软件需求 3.具体操作 3.1 重置&&冷启动(重要) 4.注意事项(重要!重要!) !!!警告!!! !&#x…

信息安全实验2

文件链接: 通过网盘分享的文件:信息安全实验2 链接: https://pan.baidu.com/s/1Fs35ZE5xx52eFBusyx7GYg?pwdfcss 提取码: fcss

写出第一个php程序

一、打开vscode,下载chinese插件、php debug、phpintelephense 二、下载完上方图片插件后,创建一个PHP文件,1.php 三、执行命令,成功输出

Prometheus Metrics和PromQL的使用

Metrics 官方解释是 Metrics are numerical measurements in layperson terms. (通俗地讲,Metrics就是数字测量) Prometheus fundamentally stores all data as time series (Prometheus把所有数据都存储为时间序列) Every time series is u…

【数据分享】2001-2023年我国省市县镇四级的逐月平均气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月平均气温栅格数据,该数据来源于国家青藏高原科学数据中心。为方便大家使用,我们还基于上述平均气温栅格数据将数据处理为Shp和Excel格式的省市县三级逐月平均气温数据(可查看之前的文章获悉详情&#…

基于SSM的高校勤工助学管理系统的设计与实现(源码+定制+参考文档)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

linux文件编程_线程

1. 基本概念 1.1. 进程与线程的概念 典型的UNIX/linux进程可以看成是只有一个控制线程,一个进程在同一时刻只做一件事情,有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。…

【重学 MySQL】五十、添加数据

【重学 MySQL】五十、添加数据 使用INSERT INTO语句添加数据基本语法示例插入多行数据注意事项 使用LOAD DATA INFILE语句批量添加数据其他插入数据的方式注意事项 在MySQL中,添加数据是数据库操作中的基本操作之一。 使用INSERT INTO语句添加数据 使用 INSERT IN…

多维度柱状图绘制

图形结果 绘制过程 数据如下 调整柱子宽度 Z轴设置 、 配色表

计算机网络:计算机网络体系结构 —— 专用术语总结

文章目录 专用术语实体协议服务服务访问点 SAP 服务原语 SP 协议数据单元 PDU服务数据单元 SDU 专用术语 实体 实体是指任何可以发送或接收信息的硬件或软件进程 对等实体是指通信双方处于相同层次中的实体,如通信双方应用层的浏览器进程和 Web 服务器进程。 协…

C++设计模式之观察者模式

一、观察者模式概念 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统,当一个对象(称为“主题”或“发布者”)改变状…

C动态内存管理

前言:不知不觉又过去了很长的一段时间。今天对C语言中的动态内存管理进行一个系统性的总结。 1 为什么要有动态内存分配 在C语言中,使用int,float,double,short等数据内置类型以及数组不是也可以开辟内存空间吗&…

【光伏混合储能】VSG并网运行,构网型变流器,虚拟同步机仿真

摘要 本文提出了一种基于光伏发电与混合储能系统结合的虚拟同步发电机(VSG)控制策略,该策略能够在并网运行时稳定电网电压和频率。通过仿真分析,验证了该策略在各种运行工况下的有效性,展示了其在电力系统中的广泛应用…

了解芯片光刻与OPC

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 参考资料: 光刻技术与基本流程 https://www.bilibili.com/video/BV1tP4y1j7BA OPC https://www.bilibili.com/video/BV1o94y1U7Td 论文:计算…

CyberBattleSim项目熟悉遇到的问题

在看手册的时候,手册中说需要显卡,配置还不低。 ——师兄说不需要这个显卡,他的独显也能跑,现在能安装配置了,配置文件安装不了确定是否进入了创建的conda环境,多尝试几次。 随着在安装gym的时候&#xf…