鸿蒙 Ark ui 实战登录界面请求网络实现教程

团队介绍

作者:徐庆

团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。欢迎合作。

前言:

各位同学有段时间没有见面 因为一直很忙所以就没有去更新博客。最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章

效果图

image.png

image.png

响应数据效果

image.png

使用本地网络服务

image.png

接口说明:

接口是我本地使用springboot 框架配合 hibernate 配合jpa写的一个后台服务 :

客户端具体实现:

"requestPermissions": [{"name": "ohos.permission.INTERNET"}
]

如图

image.png

网络请求 工具类实现

import http from '@ohos.net.http';
import Constants, { ContentType } from '../constant/Constants';
import Logger from './Logger';
import { NewsData } from '../viewmodel/NewsData';export function httpRequestGet(url: string) {return httpRequest(url, http.RequestMethod.GET);
}export function httpRequestPost(url: string, params?: NewsData) {return httpRequest(url, http.RequestMethod.POST, params);
}function httpRequest(url: string, method: http.RequestMethod,params?: NewsData){let httpRequest = http.createHttp();let responseResult = httpRequest.request(url, {method: method,readTimeout: Constants.HTTP_READ_TIMEOUT,//读取超时时间 可选,默认为60000msheader: {'Content-Type': ContentType.JSON},connectTimeout: Constants.HTTP_READ_TIMEOUT,//连接超时时间  可选,默认为60000msextraData: params // 请求参数});return responseResult.then((value: http.HttpResponse)=>{Logger.error("请求状态 --> "+value.responseCode)if(value.responseCode===200){Logger.error("请求成功");let getresult = value.result;Logger.error('请求返回数据', JSON.stringify(getresult));return getresult;}}).catch((err)=>{return "";});
}

打印日志工具类实现 :

import hilog from '@ohos.hilog';class Logger {private domain: number;private prefix: string;private format: string = '%{public}s, %{public}s';/*** constructor.** @param Prefix Identifies the log tag.* @param domain Domain Indicates the service domain, which is a hexadecimal integer ranging from 0x0 to 0xFFFFF.*/constructor(prefix: string = 'MyApp', domain: number = 0xFF00) {this.prefix = prefix;this.domain = domain;}debug(...args: string[]): void {hilog.debug(this.domain, this.prefix, this.format, args);}info(...args: string[]): void {hilog.info(this.domain, this.prefix, this.format, args);}warn(...args: string[]): void {hilog.warn(this.domain, this.prefix, this.format, args);}error(...args: string[]): void {hilog.error(this.domain, this.prefix, this.format, args);}
}export default new Logger('HTTPS', 0xFF00)

登录界面实现 :

/*** 创建人:xuqing* 创建时间:2023年8月2日08:38:50* 类说明:***/
import prompt from '@ohos.promptAction';
import router from '@ohos.router';
import CommonConstants from '../common/constant/CommonConstants';
import StyleConstant from '../common/constant/StyleConstant';
import { httpRequestGet }  from '../common/utils/OKhttpUtil';
import CommonConstant from '../common/constant/CommonConstants';
import  Logger from '../common/utils/Logger';@Extend(TextInput) function inputStyle () {.placeholderColor($r('app.color.placeholder_color')).height($r('app.float.login_input_height')).fontSize($r('app.float.big_text_size')).backgroundColor($r('app.color.background')).width(CommonConstants.FULL_PARENT).padding({ left: CommonConstants.INPUT_PADDING_LEFT }).margin({ top: $r('app.float.input_margin_top') })
}@Extend(Line) function lineStyle () {.width(CommonConstants.FULL_PARENT).height($r('app.float.line_height')).backgroundColor($r('app.color.line_color'))
}@Extend(Text) function blueTextStyle () {.fontColor($r('app.color.login_blue_text_color')).fontSize($r('app.float.small_text_size')).fontWeight(FontWeight.Medium)
}@Extend(Text) function blackTextStyle () {.fontColor($r('app.color.black_text_color')).fontSize($r('app.float.big_text_size')).fontWeight(FontWeight.Medium)
}/*** Login page*/
@Entry
@Component
struct LoginPage {@State account: string = '';@State password: string = '';@State isShowProgress: boolean = false;private timeOutId = null;@Builder imageButton(src: Resource) {Button({ type: ButtonType.Circle, stateEffect: true }) {Image(src)}.height($r('app.float.other_login_image_size')).width($r('app.float.other_login_image_size')).backgroundColor($r('app.color.background'))}async  login() {if (this.account === '' || this.password === '') {prompt.showToast({message: $r('app.string.input_empty_tips')})} else {let username:string='username=';let password:string='&password=';let networkurl=CommonConstant.LOGIN+username+this.account+password+this.password;Logger.error("请求url "+networkurl);await   httpRequestGet(networkurl).then((data)=>{console.log("data --- > "+data);Logger.error("登录请求回调结果 ---> " +data.toString());let obj=JSON.parse(data.toString());Logger.error("请求结果code -- > "+obj.code);if(obj.code===200){prompt.showToast({message: $r('app.string.login_success')})}});}}aboutToDisappear() {clearTimeout(this.timeOutId);this.timeOutId = null;}build() {Column() {Image($r('app.media.logo')).width($r('app.float.logo_image_size')).height($r('app.float.logo_image_size')).margin({ top: $r('app.float.logo_margin_top'), bottom: $r('app.float.logo_margin_bottom') })Text($r('app.string.login_page')).fontSize($r('app.float.page_title_text_size')).fontWeight(FontWeight.Medium).fontColor($r('app.color.title_text_color'))Text($r('app.string.login_more')).fontSize($r('app.float.normal_text_size')).fontColor($r('app.color.login_more_text_color')).margin({ bottom: $r('app.float.login_more_margin_bottom'), top: $r('app.float.login_more_margin_top') })Row() {//账号Text($r('app.string.account')).blackTextStyle()TextInput({ placeholder: $r('app.string.account') }).maxLength(CommonConstants.INPUT_ACCOUNT_LENGTH).type(InputType.Number).inputStyle().onChange((value: string) => {this.account = value;}).margin({left:20})}.justifyContent(FlexAlign.SpaceBetween).width(CommonConstants.FULL_PARENT).margin({ top: $r('app.float.forgot_margin_top') })Line().lineStyle().margin({left:80})Row() {//密码Text($r('app.string.password')).blackTextStyle()TextInput({ placeholder: $r('app.string.password') }).maxLength(CommonConstants.INPUT_PASSWORD_LENGTH).type(InputType.Password).inputStyle().onChange((value: string) => {this.password = value;}).margin({left:20})}.justifyContent(FlexAlign.SpaceBetween).width(CommonConstants.FULL_PARENT).margin({ top: $r('app.float.forgot_margin_top') })Line().lineStyle().margin({left:80})Row() {//短信验证码登录Text($r('app.string.message_login')).blueTextStyle().onClick(()=>{prompt.showToast({message: $r('app.string.stay_tuned_during_feature_development')})})//忘记密码Text($r('app.string.forgot_password')).blueTextStyle().onClick(()=>{prompt.showToast({message: $r('app.string.stay_tuned_during_feature_development')})})}.justifyContent(FlexAlign.SpaceBetween).width(CommonConstants.FULL_PARENT).margin({ top: $r('app.float.forgot_margin_top') })Button($r('app.string.login'), { type: ButtonType.Capsule }).width(CommonConstants.BUTTON_WIDTH).height($r('app.float.login_button_height')).fontSize($r('app.float.normal_text_size')).fontWeight(FontWeight.Medium).backgroundColor($r('app.color.login_button_color')).margin({ top: $r('app.float.login_button_margin_top'), bottom: $r('app.float.login_button_margin_bottom') }).onClick(() => {this.login();})Text($r('app.string.register_account')).onClick(()=>{prompt.showToast({message: $r('app.string.stay_tuned_during_feature_development')})}).fontColor($r('app.color.login_blue_text_color')).fontSize($r('app.float.normal_text_size')).fontWeight(FontWeight.Medium)if (this.isShowProgress) {LoadingProgress().color($r('app.color.loading_color')).width($r('app.float.login_progress_size')).height($r('app.float.login_progress_size')).margin({ top: $r('app.float.login_progress_margin_top') })}Blank()}.backgroundColor($r('app.color.background')).height(CommonConstants.FULL_PARENT).width(CommonConstants.FULL_PARENT).padding({left: $r('app.float.page_padding_hor'),right: $r('app.float.page_padding_hor'),bottom: $r('app.float.login_page_padding_bottom')})}
}

点击登录拿到输入数据和后台交互

async  login() {if (this.account === '' || this.password === '') {prompt.showToast({message: $r('app.string.input_empty_tips')})} else {let username:string='username=';let password:string='&password=';let networkurl=CommonConstant.LOGIN+username+this.account+password+this.password;Logger.error("请求url "+networkurl);await   httpRequestGet(networkurl).then((data)=>{console.log("data --- > "+data);Logger.error("登录请求回调结果 ---> " +data.toString());let obj=JSON.parse(data.toString());Logger.error("请求结果code -- > "+obj.code);if(obj.code===200){prompt.showToast({message: $r('app.string.login_success')})}});}}

这边我们拿到输入框的数据 然后进行空判 非空后 我们把请求参数拼接在我们的 url 后面去调用工具类方法请求服务器去验证登录 。

异步调用请求方法

await   httpRequestGet(networkurl).then((data)=>{console.log("data --- > "+data);Logger.error("登录请求回调结果 ---> " +data.toString());let obj=JSON.parse(data.toString());Logger.error("请求结果code -- > "+obj.code);if(obj.code===200){prompt.showToast({message: $r('app.string.login_success')})}
});

josn解析

let obj=JSON.parse(data.toString());
Logger.error("请求结果code -- > "+obj.code);
if(obj.code===200){prompt.showToast({message: $r('app.string.login_success')})
}

请求成功后toast提示

image.png

最后总结 :

这个简单案例包含了网络请求 布局还有 数据回调 字符串拼接 知识点还是很多,回调写法和flutter 很像 这边字符串拼接 直接+ 号拼接我写很low希望网友可以优化 还有json解析 后面我会专门讲解的 现在篇幅有限就不展开讲了 有兴趣的同学可以把代码下载出来再研究 最后呢 希望我都文章能帮助到各位同学工作和学习 如果你觉得文章还不错麻烦给我三连 关注点赞和转发 谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023/12/15 work

1. tcp 客户端、服务端通讯 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>#define SERVICE_PORT 9994 #define SERVICE_IP "192.168.0.106"int main(int argc, const char *argv[]) {//服务端//1. 创建…

LangChain 28 BabyAGI编写旧金山的天气预报

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

verilog基础语法-计数器

概述&#xff1a; 计数器是FPGA开发中最常用的电路&#xff0c;列如通讯中记录时钟个数&#xff0c;跑马灯中时间记录&#xff0c;存储器中地址的控制等等。本节给出向上计数器&#xff0c;上下计数器以及双向计数器案例。 内容 1. 向上计数器 2.向下计数器 3.向上向下计数…

《数据结构、算法与应用C++语言描述》-机器调度-最长处理时间(LPT)-堆应用

机器调度 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_28LongestProcessingTime 问题描述 一个工厂具有 m台一模一样的机器。我们有n 个任务需要处理。设作业i的处理时间为 t i t_i ti​&#xff0c;这个时间包括把作业放入机器…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

深入探索Logback日志框架的原理分析和开发实战指南系列 Logback日志框架Logback基本模块logback-corelogback-classiclogback-accessLogback的核心类LoggerAppenderLayoutLayout和Appender filterlogback模块和核心所属关系 Logbackj日志级别日志输出级别日志级别介绍 Logback的…

【数据结构】树状数组总结

知识概览 树状数组有两个作用&#xff1a; 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改&#xff0c;区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员&#xff0c;GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问&#xff0c;这让我们的工作变得更加容易。 什么是 GraphQL&#xff1f;它是一个抽象层&#xff0c;位于任意数量的数据源之上&#xff0c;并为您提供一个简单的 API …

为什么选择计算机?大数据时代学习计算机的价值探讨

还记得当初自己为什么选择计算机? 计算机是在90年代兴起的专业,那时候的年轻人有驾照、懂外语、懂计算机是很时髦的事情! 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的…

UE5 第三人称游戏模板白屏问题

文章目录 问题背景问题解决解决方法一解决方法二解决方法三解决方法四 问题背景 在虚幻引擎5创建第三人称游戏模板时&#xff0c;打开场景显示白屏&#xff0c;物体可以点击选中&#xff0c;出现类似这种问题&#xff0c;考虑是曝光的原因&#xff0c;在确定引擎没有问题的情况…

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

D3132|贪心算法

435.无重叠区间 初始思路&#xff1a; 我的思路就是如果有两个区间重叠&#xff0c;保留end比较小的那个区间&#xff0c;删除end比较大的区间。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]>…

CentOS7安装Docker及添加阿里云镜像加速详细教程

Docker官方安装教程网站&#xff1a;Install Docker Engine on CentOS | Docker Docs 具体流程如下&#xff1a; 1.确定你是CentOS7及以上版本 cat /etc/redhat-release 2.yum安装gcc相关 yum -y install gcc yum -y install gcc-c 3.安装需要的软件包 3.1安装docker引擎…