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

鸿蒙HarmonyOS 网络请求获取数据Http

 注意的是;要为接口返回值指定类型 ,以及定义接口数据类型

 index.ets

import { http } from '@kit.NetworkKit';interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: ''
}@Component
export default struct TabBar {@State dataList: dataListType[] = []aboutToAppear() {console.log(`我是组件钩子函数:aboutToAppear`)let http1 = http.createHttp();let responseResult = http1.request('https://www.grosup.com/banner/getall/0', {method: http.RequestMethod.GET,header: {'Content-Type': 'application/json'},readTimeout: 20000,connectTimeout: 10000});let serverData: ResponseResult = new ResponseResult();responseResult.then((value: http.HttpResponse) => {let res = JSON.stringify(value)let result = `${value.result}`;let resCode = `${value.code}`console.log('result1', result)let resultObj: object = JSON.parse(result) //一定要指定类型,不然无法获取属性console.log('result2', JSON.stringify(resultObj['data']['list'])) //this.dataList = resultObj['data']['list']}).catch(() => {})}build {Column() {Text('测试网络')// Text(JSON.stringify(this.dataList))ForEach(this.dataList, (item: dataListType) => {GridItem() {Column() {Image(item.imgUrl).objectFit(ImageFit.Cover).width('100%').height('200')// Text(item.createAt?.date)Text(item.imgUrl)}}.onClick(() => {})}, (item: dataListType, index: number) => `${item}_${index}`)}}}

定义接口类型使用interface和class的区别

建议使用class接收接口数据,因为interface不能逻辑复用与封装,直接使用又容易出现类型安全问题而导致APP闪退

很多人讲,请求接口数据要为每个接口特地写一个类很麻烦,这里用一个示例聊聊不使用类与使用类的区别。

import { plainToClass } from 'class-transformer'class Ohter {dateofBirth: string = ""
}class User {name: string = ""ohter?: OhtergetAge() {if(!this.ohter){return '数据异常'}const today = new Date();const birthDate = new Date(this.ohter.dateofBirth);let age = today.getFullYear() - birthDate.getFullYear();return age;}
}@Entry
@Component
struct Page043 {userJson: string = `{ "name":"张三","ohter":{"dateofBirth":"2000-01-01"}}`userJson_2: string = `{ "name":"李四" }`build() {Column() {Button('测试').onClick(() => {//方案一:直接使用JSON.parse+[]  ,服务端数据正常时const today = new Date();const birthDate = new Date(JSON.parse(this.userJson)['ohter']['dateofBirth']);let age = today.getFullYear() - birthDate.getFullYear();console.info(`姓名:${JSON.parse(this.userJson)['name']}`)console.info(`年龄:${age}`)})Button('测试2').onClick(() => {//方案二:将数据处理封装到class内let users: User = plainToClass(User, JSON.parse(this.userJson))console.info(`姓名:${users.name}`)console.info(`年龄:${users.getAge()}`)})Button('测试3').onClick(() => {//方案三:直接使用JSON.parse+[] ,服务端数据异常时,闪退const today = new Date();const birthDate = new Date(JSON.parse(this.userJson_2)['ohter']['dateofBirth']);let age = today.getFullYear() - birthDate.getFullYear();console.info(`姓名:${JSON.parse(this.userJson)['name']}`)console.info(`年龄:${age}`)})Button('测试4').onClick(() => {//方案四:将数据处理封装到class内 ,服务端数据异常时let users: User = plainToClass(User, JSON.parse(this.userJson_2))console.info(`姓名:${users.name}`)console.info(`年龄:${users.getAge()}`)})}.width('100%').height('100%')}
}

总结:

方案一没使用任何框架,也不需要为接口写类, [] 就能拿到数据,拿到后,需要自己获取一下年,做减法,才能知道这个人的真实年龄。这是最正常的写法。

方案二相比方案一,体验了封装class的好处,可以把复杂的逻辑封装到class内,而不必把一堆逻辑代码暴露在page内。

方案三体现了方案一的缺点,万一接口数据给的不正常,方案一这种很容易拿不到数据,导致app崩溃

方案四体现了class的另一个好处,就是可以在内部事先加判断,避免接口数据不正确而导致app崩溃

【总结】使用class的好处是

1、代码可读性和维护性提升:可以对属性添加注释、使得开发者能够更容易理解数据的组成和用途,这对于团队协作和长期维护是非常有利的。

2、类型安全:通过类的定义提前预防这类错误,而不是在运行时遭遇异常或“闪退”。

3、逻辑复用与封装:数据处理逻辑被集中在一处,便于修改和复用。

4、易于扩展和继承:类支持继承,允许你基于现有类创建更具体的子类,轻松添加或覆盖功能。这为软件的未来扩展提供了便利。

5、错误处理更加优雅:提高了应用的健壮性。

相关文章:

鸿蒙HarmonyOS 网络请求获取数据Http

注意的是;要为接口返回值指定类型 ,以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…...

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…...

JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现

目录 一、密码学介绍 1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码 4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法 5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法 6.1 介绍6.2 加密模式和填充方式6.3 CryptoJ…...

【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务 分布式事务是指跨多个独立服务或系统的事务管理,以确保这些服务中的数据变更要么全部成功,要么全部回滚,从而保证数据的一致性。在微服务架构和分布式系统中,由于业务逻辑往往会跨多个服务,传统的单体事务…...

apache2配置多站点

环境 ubuntu 14.04 apache2 Server version: Apache/2.4.7 (Ubuntu) Server built: Apr 3 2019 18:04:25 步骤 修改/etc/apache2/sites-enabled/000-default.conf 增加VirtualHost段&#xff0c;指定不同的ServerName、DocumentRoot等参数 <VirtualHost *:80>…...

基于PyQt Python的深度学习图像处理界面开发(一)

Python标准库更多的适合处理后台任务&#xff0c;唯一的图形库tkinter使用起来很不方便&#xff0c;所以后来出现了针对Python图形界面开发的扩展库&#xff0c;例如PyQt。 在介绍PyQt之前&#xff0c;必须先简单介绍一下Qt。Qt是一个C可视化开发平台&#xff0c;是一个跨平台的…...

【Linux网络】Linux网络编程套接字,UDP与TCP

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux网络编程套接字 &#x1f4d2;1. 端口号&#x1f4dc;2. 初识TCP协议与UDP协议&#x1…...

Vue3 -- 强制统一包管理器工具【企业级项目配置保姆级教程6】

引言: 团队开发项目的时候,需要统一包管理器工具,因为不同包管理器工具下载同一个依赖,可能版本不一样,导致项目出现bug问题,因此包管理器工具需要统一管理!!所以就需要我们强制统一包管理器工具。 创建scripts目录和preinstall.js文件: 在根目录创建scritps/preinstal…...

Winform实现自制浏览器JavaScript注入

让我们一起走向未来 &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[1504566…...

【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出

目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…...

javascript用来干嘛的?赋予网站灵魂的语言

javascript用来干嘛的&#xff1f;赋予网站灵魂的语言 在互联网世界中&#xff0c;你所浏览的每一个网页&#xff0c;背后都有一群默默工作的代码在支撑着。而其中&#xff0c;JavaScript就像是一位技艺精湛的魔术师&#xff0c;它赋予了网页生命力&#xff0c;让原本静态的页…...

Flutter Getx状态管理

在 Flutter 开发中&#xff0c;状态管理是一个非常重要的话题。随着应用变得更加复杂&#xff0c;状态管理的方式也变得越来越多。Flutter 提供了多种状态管理的解决方案&#xff0c;如 Provider、Riverpod、BLoC 等&#xff0c;而在这些选项中&#xff0c;GetX 作为一个轻量级…...

《成法》读书笔记

稻盛和夫的《成法》是一部关于个人和企业成功哲学的作品&#xff0c;结合了他在经营京瓷和KDDI&#xff0c;以及重建日航&#xff08;JAL&#xff09;过程中的经验和智慧。 以下是这本书的读书笔记&#xff0c;涵盖其核心思想和重要概念&#xff1a; 1. 以“心”为本 内容概…...

TensorFlow 2.0 环境配置

官方文档&#xff1a;CUDA Installation Guide for Windows 官方文档有坑&#xff0c;windows的安装指南直接复制了linux的指南内容&#xff1a;忽略这些离谱的信息即可。 可以从官方文档知悉&#xff0c;cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…...

Ekman理论回归

Scientific reportsEkman revisited: Surface currents to the left of the winds in the Northern HemisphereVagn Walfrid Ekman1905年的理论描述了地球旋转受到风的作用&#xff0c;摩擦边界层中的流场&#xff0c;北半球总是在海表风的右侧&#xff0c;南半球总是在海表风的…...

算法演练----24点游戏

给定4个整数&#xff0c;数字范围在1~13之间任意使用-*/&#xff08;&#xff09;&#xff0c;构造出一个表达式&#xff0c;使得最终结果为24&#xff0c; 方法一 算法分析&#xff1a;加括号和取出重复表达式 # 导入精确除法模块&#xff0c;使得在Python2中除法运算的行为更…...

【学习心得】Python好库推荐——tiktoken

一、tiktoken是什么&#xff1f; tiktoken是一个快速BPE分词器&#xff0c;是由 OpenAI 开发的一个用于文本处理的 Python 库&#xff0c;主要用于将文本编码为数字序列&#xff08;称为 "tokens"&#xff09;&#xff0c;或将数字序列解码为文本。这一过程被称为 &q…...

MacBook不额外安装软件,怎样投屏到安卓手机上?

提起iPhone或MacBook的投屏&#xff0c;人们总会想到airplay功能。但离开了苹果生态&#xff0c;其他品牌的手机电脑就未必配备airplay功能了。 如果想要将MacBook的电脑屏幕共享到安卓手机或平板上&#xff0c;到底要怎样做&#xff1f;需要安装什么软件吗&#xff1f; 不需要…...

flink sql + kafka + mysql 如何构建实时数仓

构建一个基于 Flink SQL、Kafka 和 MySQL 的实时数据仓库(Data Warehouse)架构,可以通过流处理的方式实现高效、实时的数据集成与分析。以下是如何利用这三者构建实时数仓的步骤与实现: 架构概述 Kafka:作为流数据平台,负责接收和传输来自不同源系统(如应用日志、传感器…...

Go语言开发基于SQLite数据库实现用户表查询详情接口(三)

背景 上一章 Go语言开发基于SQLite数据库实现用户表新增接口(二) 这一章我们实现用户表的查询详情接口 代码实现 mapper层 type UserMapper interface {GetById(id uint64) (*model.User, error)}type userMapper struct { }func (m *userMapper) GetById(id uint64) (*mod…...

如何快速掌握Switch-Toolbox:终极任天堂游戏文件编辑完整指南

如何快速掌握Switch-Toolbox&#xff1a;终极任天堂游戏文件编辑完整指南 【免费下载链接】Switch-Toolbox A tool to edit many video game file formats 项目地址: https://gitcode.com/gh_mirrors/sw/Switch-Toolbox 如果你一直想修改任天堂Switch、3DS或Wii U游戏文…...

Armv8/v9架构SCTLRMASK_EL2寄存器解析与应用

1. AArch64系统控制寄存器基础解析在Armv8/v9架构中&#xff0c;系统控制寄存器(System Control Registers)是处理器状态配置的核心组件&#xff0c;它们分布在不同的异常级别(EL0-EL3)&#xff0c;用于管理处理器行为、内存系统、安全状态等关键功能。这些寄存器通常通过MRS/M…...

3分钟完成缠论分析:ChanlunX通达信插件实现自动画中枢

3分钟完成缠论分析&#xff1a;ChanlunX通达信插件实现自动画中枢 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为缠论分析的手动画线而烦恼吗&#xff1f;ChanlunX缠论插件为你带来终极解决方案&a…...

3步免费修复损坏视频:Untrunc完整视频恢复指南

3步免费修复损坏视频&#xff1a;Untrunc完整视频恢复指南 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾因为视频文件损坏而无法播放珍贵的回忆&#xff…...

如何通过DeepEval解决LangChain应用的可观测性与评估难题

如何通过DeepEval解决LangChain应用的可观测性与评估难题 【免费下载链接】deepeval The LLM Evaluation Framework 项目地址: https://gitcode.com/GitHub_Trending/de/deepeval DeepEval作为专业的LLM评估框架&#xff0c;为LangChain开发者提供了从测试到生产监控的完…...

如何在3分钟内为Unity游戏配置实时AI翻译:XUnity.AutoTranslator终极指南

如何在3分钟内为Unity游戏配置实时AI翻译&#xff1a;XUnity.AutoTranslator终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因为外语游戏的语言障碍而错过精彩剧情&#xff1f;XUnity.A…...

基于FPGA的嵌入式频谱分析仪设计:低功耗实时信号处理方案

1. 项目概述&#xff1a;为什么要在FPGA上做频谱分析仪&#xff1f;做射频测试的工程师&#xff0c;对频谱分析仪肯定不陌生。实验室里动辄几十万上百万的台式机&#xff0c;性能强悍&#xff0c;功能全面&#xff0c;但有个问题&#xff1a;它离不开实验室。当你需要做外场测试…...

如何3分钟完成Steam游戏清单下载?Onekey工具终极指南

如何3分钟完成Steam游戏清单下载&#xff1f;Onekey工具终极指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾经为了获取Steam游戏清单而花费数小时&#xff1f;手动查找App ID、配置…...

保姆级教程:在Ubuntu 22.04 LTS上从零部署Zabbix 6.0监控系统(含MariaDB配置)

从零构建企业级监控系统&#xff1a;Ubuntu 22.04下Zabbix 6.0与MariaDB深度整合指南 第一次接触服务器监控系统时&#xff0c;我被各种专业术语和复杂的配置步骤弄得晕头转向。直到遇到Zabbix&#xff0c;这个开箱即用的监控解决方案彻底改变了我的运维工作方式。本文将带你完…...

LRCGET:如何一键批量下载本地音乐歌词的终极指南

LRCGET&#xff1a;如何一键批量下载本地音乐歌词的终极指南 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否厌倦了为每一首本地音乐手动寻找歌词…...