当前位置: 首页 > news >正文

HarmonyOS笔记3:从网络数据接口API获取数据

面向HarmonyOS的移动应用一般采用MVVM模式(见参考文献【1】),其中:
M(Model层):模型层,存储数据和相关逻辑的模型。它表示组件或其他相关业务逻辑之间传输的数据。Model是对原始数据的进一步处理。
V(View层):视图层,在ArkUI框架中通常是@Components修饰组件渲染的移动应用界面的UI。
VM(ViewModel层):视图模型层,在ArkUI中,ViewModel是存储在自定义组件的状态变量、LocalStorage和AppStorage中的数据。这些数据为UI提供渲染的内容,同时UI界面也可以通过视图组件修改模型数据。是模型层和视图层的中介。
在创建一个移动应用中,最重要的是获取数据以及对数据的处理。在这篇文章中,主要讨论一下模型层中的数据来源。在HarmonyOS中,获取数据的方式主要有:

1.从网络中获取数据接口API。
2.从华为云数据库获取网络数据库的资源。
3.从移动终端直接获取本地的数据

从这篇文章开始,将分别对以上三种情况简单介绍一下。本篇文章中简单介绍网络中获取并使用数据接口API的数据。

一、数据接口API

API接口的请求方法:常用的HTTP请求方法有GET、POST、PUT、DELETE等,不同的请求方法对应不同的操作。
API的URL:这是你的代码将发送请求的地址。
API的参数:一些API可能需要参数来完成特定的操作,例如,你可能需要提供一个特定的ID来获取某个特定的数据。
API的返回数据:你需要知道API返回的数据的格式(如JSON、XML等)以及数据的含义。

例如:请求“https://dog.ceo/api/breeds/image/random”(关于数据api接口的更详细介绍,见参考文献【2】)返回的JSON数据如下:
在这里插入图片描述
请求获取的随机JSON数据如下:

{
“message”:“https://images.dog.ceo/breeds/gaddi-indian/Gaddi.jpg”,
“status”:“success”
}

二、网络访问数据接口API

1.创建一个新的HarmonyOS项目

在这里插入图片描述
在这里插入图片描述
点击确认创建新的项目。

2.配置网络访问许可

在新项目的entry模块的module.json5配置文件中,新增网络访问许可,同时修改"extensionAbilities"的"exported"属性为true,代码如下所示:

{"module": {"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "EntryAbility","deviceTypes": ["phone","tablet","2in1"],"requestPermissions": [{"name": "ohos.permission.INTERNET"}],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:layered_image","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}],"extensionAbilities": [{"name": "EntryBackupAbility","srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets","type": "backup","exported":true,"metadata": [{"name": "ohos.extension.backup","resource": "$profile:backup_config"}]}]}
}

3.在页面中增加获取API数据的请求

请求网络资源的可以通过request接口来实现

request接口开发步骤

  1. 从@kit.NetworkKit中导入http命名空间。 调用createHttp()方法,创建一个HttpRequest对象。
  2. 调用该对象的on()方法,订阅http响应头事件,此接口会比request请求先返回。可以根据业务需要订阅此消息。
  3. 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。 按照实际业务需要,解析返回结果。
  4. 调用该对象的off()方法,取消订阅http响应头事件。
  5. 当该请求使用完毕时,调用destroy()方法主动销毁。

下列的代码实现了对上述的api的访问,具体内容如下:
修改界面的Index.ets

//导入包
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';@Entry
@Component
struct Index {@State imageURL: string = ''aboutToAppear(){this.doNetwork()}build() {RelativeContainer() {Text(this.imageURL).id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }})}.height('100%').width('100%')}async doNetwork(){//设置访问数据api的url链接let apiUrl = "https://dog.ceo/api/breeds/image/random"//创建一个Http请求let httpRequest = http.createHttp()//订阅http响应头事件httpRequest.on("headersReceive",(header)=>{console.info('header: ' + JSON.stringify(header));})//请求urlhttpRequest.request(apiUrl,{method:http.RequestMethod.GET,header:{'Content-Type':'application/json',},usingCache:true,connectTimeout:6000,//连接时间6sreadTimeout:6000,//读取时间6s},(err:BusinessError,response:http.HttpResponse)=>{if(!err){console.info(`响应的数据结果是:${JSON.stringify(response.result)}`)}else {console.error('error:' + JSON.stringify(err));// 取消订阅HTTP响应头事件httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();}})}
}

因为界面还未定义,因此运行时,可以在日志窗口中观察到获取到api数据,运行结果如下所示:
在这里插入图片描述
但是获取的JSON字符串需要得到具体的属性数据,例如图片的链接地址,因此需要将JSON数据转换成数据对象。

4.解析JSON数据

因为需要解析JSON字符串,定义接口ReceivedData:

interface ReceivedData{message,status
}

然后将JSON字符串解析成ReceivedData对象,代码段如下:

//将获取的数据转换成JSON字符串
let result = JSON.stringify(response.result)
console.info(`响应的数据结果是:${result}`)
//解析JSON字符串转换成数据对象
let data:ReceivedData = JSON.parse(result)

通过这样的方式获取了特定的对象。

5.使用解析后的数据

修改Index.ets代码,修改UI界面,使得点击按钮不断刷新界面,完整的Index.ets代码如下:

//导入包
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';@Entry
@Component
struct Index {@State imageURL: string = ''aboutToAppear(){this.doNetwork()}build() {Column() {if(this.imageURL!=''){Image(this.imageURL).width("100%").height(300)}Text(this.imageURL).id('HelloWorld').fontSize(12).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }})Button("刷新").onClick(()=>{this.doNetwork()})}.height('100%').width('100%').justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}async doNetwork(){//设置访问数据api的url链接let apiUrl = "https://dog.ceo/api/breeds/image/random"//创建一个Http请求let httpRequest = http.createHttp()//订阅http响应头事件httpRequest.on("headersReceive",(header)=>{console.info('header: ' + JSON.stringify(header));})//请求urlhttpRequest.request(apiUrl,{method:http.RequestMethod.GET,expectDataType: http.HttpDataType.OBJECT,//指定返回数据的类型header:{'Content-Type':'application/json',},usingCache:true,connectTimeout:6000,//连接时间6sreadTimeout:6000,//读取时间6s},(err:BusinessError,response:http.HttpResponse)=>{if(!err){//将获取的数据转换成JSON字符串let result = JSON.stringify(response.result)console.info(`响应的数据结果是:${result}`)//解析JSON字符串转换成数据对象let data:ReceivedData = JSON.parse(result)this.imageURL = data.messageconsole.info(`图片地址:${data.message}-获取状态:${data.status}`)}else {console.error('error:' + JSON.stringify(err));// 取消订阅HTTP响应头事件httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();}})}
}interface ReceivedData{message,status
}

最后的运行结果如下图所示:

在这里插入图片描述
在这里插入图片描述

参考文献

【1】“MVVM模式” HarmonyOS Developer
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-mvvm-V5
【2】“推荐 GitHub 上的一套公开 API 接口,简直不要太全!” 腾讯云开发者社区
http://cloud.tencent.com/developer/article/2082773
【3】“HTTP数据请求” HarmonyOS Developer
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/http-request-V5

相关文章:

HarmonyOS笔记3:从网络数据接口API获取数据

面向HarmonyOS的移动应用一般采用MVVM模式(见参考文献【1】),其中: M(Model层):模型层,存储数据和相关逻辑的模型。它表示组件或其他相关业务逻辑之间传输的数据。Model是对原始数据的进一步处理…...

Mac 下生成core dump

mac下生成core dump 使用ulimit -c查看ulimit设置,显示unlimited表示开启,显示0表示关闭,通过ulimit -c unlimited打开设置; 但是这个只在当前窗口有效果。如果需要变成系统全局设置。 就需要去改/etc/profile文件,打开,然后加上ulimit -c unlimited就可…...

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

目录 1、SerDes和GTX的关系 2、传输总线的变化 2.1、从串行到并行 2.2、从并行又回到串行 文章总目录点这里:《FPGA接口与协议》专栏的说明与导航 1、SerDes和GTX的关系 Hold On,这个系列文章不是讲GTX收发器的吗?怎么一开始就扯到SerDes上了?GTX和SerDes之间有…...

golang实现Digest认证鉴权接口

什么是Digest认证鉴权接口? Digest认证鉴权接口是一种基于摘要算法的身份验证方法,用于确保API请求的安全性。在实际应用中,常常使用HTTP协议的Digest认证鉴权接口来验证请求的合法性。下面是一种常见的Digest认证鉴权流程: 1. 客户端发送HTTP请求到服务器,请求接口资源…...

机房托管服务器说明

机房托管服务器是指将企业或个人的服务器放置到专业数据中心(IDC机房)进行管理和维护,由数据中心提供稳定、安全的运行环境以及网络连接等基础设施支持。rak小编为您整理发布机房托管服务器说明详细内容。 通过托管服务器到专业机房,企业能够享受到高性能…...

CookieMaker工作室合作开发C++项目十一:拟态病毒

(注:本文章使用了“无标题技术”) 一天,我和几个同事,平台出了点BUG,居然给我刷出了千年杀,同事看得瑕疵欲裂,发誓要将我挫骨扬灰—— (游戏入口:和平精英31.…...

57、PHP 实现 从扑克牌中随机抽取5张牌,判断是不是一个顺子

题目: PHP 实现 从扑克牌中随机抽取5张牌,判断是不是一个顺子 描述: 即这5张牌是不是连续的2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 解题思路&#xf…...

前端HTML+CSS查漏补缺——仿制百度搜索首页的一些思考

在像素模仿百度搜索首页的时候,在实现的时候,遇到了一些值得记录的点。 在这个过程中,也顺便看了看百度的源码,感觉很有意思。 对了,QQ截屏里面获取到的颜色,是不大正确的,会有点误差。 这是我…...

【Python】实现一个个人理财助手小程序

以下是一个简化的 Python 代码框架,以及如何实现上述功能点的基本思路,可以基于这个框架进一步开发和完善你的小程序。 以下是一个简化的 Python 代码框架,使用了基本的类和函数来模拟上述功能: import pandas as pd from crypt…...

【GCC】结合GPT4 延迟梯度学习2:延迟梯度的计算及阈值更新

上文,充分发现了 排队梯度延迟的重要性, 【GCC】结合GPT4 延迟梯度学习1:公式推导及理论分析 例如: 延迟梯度为正数时,是单位时间内的排队队列长度的“增长速度” 延迟梯度与 发送速率(接收速率?)有直接的关系。 因为有 观测误差、随机因素、噪声,所以要对延迟梯度进行…...

灰豚数字人MotionAI大模型完成备案,模型已超百亿参数!

据8月5日网信办公告,灰豚数字人MotionAI大模型已完成备案。灰‬豚‬大模型拥有超过百亿参数,是综合全面性的视频生成大模型,融合了数字人大模型、声音大模型、文本大模型、视频大模型、图像大模型等技术。 灰豚AI数字人隶属于温州专帮信息科…...

zsh 配置 docker 自动补全

zsh 配置 docker 自动补全 在终端中使用 docker 的命令的时候必须要全部手敲,没有提示,于是就在找是否有自动补全的脚本,搜索了一圈踩了一些坑总结了一下具体的步骤。 首先执行如下命令: mkdir -p ~/.zsh/completion curl -L h…...

鸿蒙第三方应用.hap打包、安装流程。

最近在华为手表上安装第三方应用(源码打包构建应用,需要签名)。网上看了教程,在此记录下。 准备工作:先安装DevEco Studio开发工具。 进入华为 appgallery connect网站(注册、开发者实名认证) …...

leetcode:找到字符串中所有字母异位词

题目: 给定两s和p中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 : 输入 输出 解释 s "cbaebabacd", p "…...

C语言学习

学习内容 两道题目 猜数字游戏 goto语句 关机程序 代码 //4.编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 welcome to china!!!! //#include<windows.h> //#include<stdlib.h> //int main() //{ // char arr1[] "welcome to c…...

Java面试题:MySQL高频面试题

MySQL常见面试题01 1、B树跟B树的区别&#xff1f; MySQL为什么选择B树来存储索引&#xff1f; 层数低,可以存放的数据多 2、InnoDB和MyISAM的区别&#xff1f; i:天生支持行锁,手动支持表锁,有事务,索引和数据一起存储 m:支持表锁不支持行锁,无事务,索引和数据分开存储 3、…...

使用js给数字进位,比如23333元进位成2.33万元

文章目录 一、进位函数&#xff1a;二、使用&#xff1a;总结 一、进位函数&#xff1a; //数字进位getUnitObjWithNumber(value){let dataconst returnObj {}let dw let chengshu 1if (isNaN(value)) {data 0} else {data parseFloat(value)}if (Math.abs(data) < 100…...

Java二十三种设计模式-享元模式(12/23)

享元模式&#xff1a;高效管理大量对象的设计模式 引言 在软件开发中&#xff0c;有时需要处理大量相似或重复的对象&#xff0c;这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案&#xff0c;通过共享对象的共同部分来减少内存占用。 基础知识&#xff0c…...

腾讯云AI代码助手助力软件开发体验分享

引言 现在&#xff0c;AI工具在软件开发中变得越来越重要&#xff0c;它们能显著提升效率和代码质量。本文就来分享一下我用腾讯云AI代码助手的经历&#xff0c;看看它是怎么在开发中帮了大忙的。 开发环境介绍 这次的项目用的是JavaScript&#xff0c;开发环境是Windows 10…...

Leetcode力扣刷题——182.查找重复的电子邮箱

题目 编写解决方案来报告所有重复的电子邮件。 请注意&#xff0c;可以保证电子邮件字段不为 NULL。 以 任意顺序 返回结果表。 结果格式如下例。 结果 # Write your MySQL query statement below select Email from Person group by email having count(*)>1; 知识点 c…...

【EI复现】【基于改进粒子群算法求解】一种建筑集成光储系统规划运行综合优化方法附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…...

Python MCP服务器开发模板实战手册(含完整CI/CD流水线与OpenTelemetry集成)

第一章&#xff1a;Python MCP服务器开发模板概览与核心设计理念Python MCP&#xff08;Model-Controller-Protocol&#xff09;服务器开发模板是一套面向协议驱动、可插拔架构的轻量级服务框架&#xff0c;专为构建高内聚、低耦合的远程过程调用&#xff08;RPC&#xff09;与…...

零基础入门ai开发:在快马平台用openclaw tavily打造你的第一个智能搜索应用

作为一个刚接触AI开发的新手&#xff0c;最近我在InsCode(快马)平台上尝试用OpenClaw Tavily API做了一个智能搜索小工具&#xff0c;整个过程比想象中简单很多。今天就把这个入门经验分享给大家&#xff0c;希望能帮助同样想尝试AI应用开发的朋友少走弯路。 为什么选择Tavily …...

Win11Debloat:轻松打造极速、纯净Windows 11的终极指南

Win11Debloat&#xff1a;轻松打造极速、纯净Windows 11的终极指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and c…...

用什么来搭建知识库(写给小白的LLM工具选型系列:第六篇)

诸神缄默不语-个人技术博文与视频目录 &#xff08;本文为AI生成&#xff0c;未做人工验证&#xff0c;也未列出参考资料。以后可能会更新&#xff09; 本文面向小白读者&#xff0c;介绍基于AI的大规模知识库&#xff08;RAG&#xff09;的基本原理和常见方案。我们首先用通…...

基于IEEE33节点的节点碳势计算与可视化 摘要:代码主要是基于IEEE33节点这个标准算例

基于IEEE33节点的节点碳势计算与可视化 摘要&#xff1a;代码主要是基于IEEE33节点这个标准算例&#xff0c;然后对各个节点碳势进行了逐一的计算&#xff0c;计算完毕后&#xff0c;通过MATLAB编程&#xff0c;对各个节点的碳势进行了可视化&#xff0c;非常清晰的一个代码&am…...

[Python3高阶编程] - 再论 WSGI、Web服务器和Python Web应用的关系

一、核心关系&#xff1a;WSGI 是“接口标准”&#xff0c;Web 服务器是“实现者”简单定义组件类型职责代表实现WSGI协议标准&#xff08;PEP 3333&#xff09;定义 Web 服务器与 Python 应用之间的通信接口规范&#xff1a;• 函数签名• 参数格式• 数据流向• 错误处理不是…...

2026届必备的六大AI科研神器解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 步入人工智能生成内容越来越普遍的大环境里&#xff0c;把文本的机器感给降低变成了提高可读…...

如何快速提升技术文档专业度:Obsidian代码美化插件终极指南

如何快速提升技术文档专业度&#xff1a;Obsidian代码美化插件终极指南 【免费下载链接】obsidian-better-codeblock Add title, line number to Obsidian code block 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-better-codeblock 还在为技术笔记中单调乏味…...

eksctl多集群管理终极指南:跨区域部署和统一运维实践

eksctl多集群管理终极指南&#xff1a;跨区域部署和统一运维实践 【免费下载链接】eksctl The official CLI for Amazon EKS 项目地址: https://gitcode.com/gh_mirrors/ek/eksctl eksctl作为Amazon EKS官方CLI工具&#xff0c;为用户提供了快速创建、管理和运维Kuberne…...