鸿蒙OS(ArkTS) 案例:【使用http网络请求框架加载验证码】

需求:加载验证码;1.下载验证码图像文件;2.获取header里面验证码ID

踩坑--踩坑--踩坑

根据文档使用 request.downloadFile 请求,官方示例:

// pages/xxx.ets
// 将网络资源文件下载到应用文件目录并读取一段内容
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import request from '@ohos.request';// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;try {request.downloadFile(context, {url: 'https://xxxx/xxxx.txt',filePath: filesDir + '/xxxx.txt'}).then((downloadTask) => {downloadTask.on('complete', () => {console.info('download complete');let file = fs.openSync(filesDir + '/xxxx.txt', fs.OpenMode.READ_WRITE);let buf = new ArrayBuffer(1024);let readLen = fs.readSync(file.fd, buf);console.info(`The content of file: ${String.fromCharCode.apply(null, new Uint8Array(buf.slice(0, readLen)))}`);fs.closeSync(file);})}).catch((err) => {console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);});
} catch (err) {console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
}

里面存在一个解决不到的问题是,获取不到header里面验证码ID,downloadTask 无法获取....只能换常规方法获取了。

换 httpRequest.request 来请求,示例代码如下:

  /*** 下载文件(验证码使用)*/static httpFileDownload(url: string, params?: any): Promise<ResponseResultJson> {LogUtils.i("下载文件URL:" + url + "\n请求参数:" + (params != undefined ? "\n请求参数:" + JSON.stringify(params) : "无参数"));//let httpRequest = http.createHttp();httpRequest.on('headersReceive', (header) => {//用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息});//let responseResult = httpRequest.request(url, {method: http.RequestMethod.GET,readTimeout: RequestConstants.readTimeout,connectTimeout: RequestConstants.connectTimeout,header: {'Content-Type': ContentType.JSON},expectDataType: http.HttpDataType.ARRAY_BUFFER, // 可选,指定返回数据的类型extraData: params});let responseResultJson = new ResponseResultJson();return responseResult.then(async (responseResult: http.HttpResponse) => {LogUtils.i("文件下载请求响应URL:" + url + "\n响应结果:" + "\n" + JSON.stringify(responseResult));if (responseResult.responseCode === ResponseConstants.RESPONSE_SUCCESS) {let header = responseResult.headerLogUtils.i('解析响应 header \n' + JSON.stringify(header));let headerJson = JSON.stringify(header)let headerObj = JSON.parse(headerJson)let sessionId = headerObj.sessionid as stringlet serverModel = headerObj.servermodel as stringlet encryptType = headerObj.encrypttype as string//保存 headerawait AppHelper.commitSessionId(sessionId);await AppHelper.commitServerModel(serverModel);await AppHelper.commitEncryptType(encryptType);//解析文件let result = responseResult.result as ArrayBuffer// let filePath = FileConstants.rootFile + "/verifyCode_" + TimeExUtils.getNowYMDHMS1() + '.jpg'let isHave = fs.accessSync(FileConstants.pathFile) //检查文件目录是否存在if (!isHave) fs.mkdirSync(FileConstants.pathFile) //创建目录//let filePath = FileConstants.pathFile + "verifyCode_" + TimeExUtils.getNowYMDHMS1() + '.jpg'let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);fs.writeSync(file.fd, result); //将数据写入文件fs.closeSync(file); //关闭文件//LogUtils.i("保存文件成功:\n" + filePath + "\t" + await FileUtils.getPathSize(filePath));//结果responseResultJson.code = ResponseConstants.CODE_SUCCESSresponseResultJson.isSuccess = trueresponseResultJson.status = responseResult.responseCoderesponseResultJson.serverModel = serverModelresponseResultJson.filePath = filePath} else {responseResultJson.code = ResponseConstants.CODE_ERROR;responseResultJson.message = "业务异常:" + JSON.stringify(responseResult)responseResultJson.isSuccess = false}return responseResultJson;}).catch((error) => {LogUtils.i("文件下载请求响应URL:" + url + "\n请求异常:\n" + JSON.stringify(error))responseResultJson.code = ResponseConstants.CODE_ERROR;responseResultJson.message = "请求异常:\n" + JSON.stringify(error)responseResultJson.isSuccess = falsereturn responseResultJson;});}

里面无用工具类可以不用在意...里面获取header可以有2种方法

方法一:

鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术
鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。或+mau123789学习,是v喔

搜狗高速浏览器截图20240326151547.png

 httpRequest.on('headersReceive', (header) => {//用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息});

方法二:

let header = responseResult.headerLogUtils.i('解析响应 header \n' + JSON.stringify(header));let headerJson = JSON.stringify(header)let headerObj = JSON.parse(headerJson)let sessionId = headerObj.sessionid as stringlet serverModel = headerObj.servermodel as stringlet encryptType = headerObj.encrypttype as string

获取验证码文件关键代码:

1.参数里面的 expectDataType 需要设置为 http.HttpDataType.ARRAY_BUFFER;

  1. 结果转换为ArrayBuffer,let result = responseResult.result as ArrayBuffer

运行日志:

cke_2126.png

运行效果:

cke_6226.png

完毕啦!!!! 验证码获取成功了!!!!

鸿蒙值得开发者入行

为什么这么说?市场是决定人力需求的,数据说话最管用:

1、鸿蒙其全栈自研,头部大厂商都陆续加入合作开发鸿蒙原生应用——人才需求上涨

2、鸿蒙作为新系统、新技术,而现在市面上技术人才少——高薪招聘开启

3、鸿蒙1+8+N生态,不仅只有应用开发;还有车载、数码、智能家居、家电等——就业范围广

4、纯血鸿蒙,目前没有多少人熟悉。都处于0基础同一起跑线——无行业内卷

开发者最需要什么?岗位多、薪资高、不内卷、行业竞争低。而当下的鸿蒙恰恰符合要求。

那么这么好的鸿蒙岗位,应聘要求都很高吧?其实不然鸿蒙作为新出的独立系统,其源头上大家都处于同一水平线上,一开始的技术要求都不会很高,毕竟面试官也是刚起步学习。招聘要求示例:

从信息看出,几乎应职要求是对标有开发经验的人群。可以说鸿蒙对开发者非常友好,尽管上面没提鸿蒙要求,但是面试都会筛选具有鸿蒙开发技能的人。我们程序员都知道学习开发技术,最先是从语言学起,鸿蒙语言有TS、ArkTS等语法,那么除了这些基础知识之外,其核心技术点有那些呢?下面就用一张整理出的鸿蒙学习路线图表示:

从上面的OpenHarmony技术梳理来看,鸿蒙的学习内容也是很多的。现在全网的鸿蒙学习文档也是非常的少,下面推荐一些:完整内容可在头像页保存,或这qr23.cn/AKFP8k甲助力

内容包含:鸿蒙OpenHarmony知识←前往

  • ArkTS
  • 声明式ArkUI
  • 多媒体
  • 通信问题
  • 系统移植
  • 系统裁剪
  • FW层的原理
  • 各种开发调试工具
  • 智能设备开发
  • 分布式开发等等。

这些就是对往后开发者的前景分享,希望大家多多点赞关注喔!

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

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

相关文章

【LVGL-消息框部件(lv_msgbox)】

LVGL-消息框部件&#xff08;lv_msgbox&#xff09; ■ LVGL-消息框部件&#xff08;lv_msgbox&#xff09;■ 示例一&#xff1a;隐藏&#xff0c;弹窗消息框■ 示例二&#xff1a;■ 综合示例&#xff1a; ■ LVGL-消息框部件&#xff08;lv_msgbox&#xff09; ■ 示例一&am…

金蝶BI方案治好我的数据分析困难症

结构分析、趋势分析、分布分析、对比分析……这还是大方向的&#xff0c;细分下来还会根据数据类型和具体场景不同而不同&#xff0c;不仅如此&#xff0c;每个月的数据分析需求还可能不同&#xff0c;导致分析量多且复杂&#xff0c;加班加点也忙不过来。但金蝶BI方案就不一样…

maven搭建继承聚合多模块项目,父项目更新依赖版本,子项目不会立即更新问题解决

1.网上文章&#xff08;一&#xff09;: idea中maven pom导入依赖失效&#xff0c;点刷新也没反应,解决方法 方式1: 右侧Maven,点击reload all maven project 如图&#xff0c;这是所有模块都进行刷新 发现不管用呀&#xff0c;子模块还是没有更新,试了很多遍不行&#xff0c…

U盘打不开怎么办?数据恢复与预防全攻略

U盘突发故障&#xff0c;无法打开之困 在日常生活中&#xff0c;U盘已成为我们存储和传输数据的重要工具。然而&#xff0c;当有一天你插入U盘时&#xff0c;电脑却提示无法识别或打开&#xff0c;这无疑会给你带来不小的困扰。面对这种情况&#xff0c;很多人可能会感到束手无…

AES加密解密算法

一&#xff0c;AES算法概述 AES属于分组加密&#xff0c;算法明文长度固定为128位&#xff08;单位是比特bit&#xff0c;1bit就是1位&#xff0c;128位等于16字节&#xff09; 而密钥长度可以是128、192、256位 当密钥为128位时&#xff0c;需要循环10轮完成加密&#xff0…

3.1 SQL概述

SQL&#xff08;Structured Query Language&#xff09; 结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 功能&#xff1a;查询&#xff0c;数据库模式创建&#xff0c;数据库数据的插入与修改&#xff0c;数据库完整性、安全…

js网页侧边悬浮滚动广告

原生js实现网页侧边随页面滚动广告效果 css /*测试用的高度*/html {height: 3000px;}#rightroll {position: absolute;}.close {position: absolute;right: 0;top: -10px;}.close img {width: 20px;height: 20px;}li {list-style: none;width: 80px;height: 80px;background-c…

argocd部署

一、前言 ArgoCD 是一个开源的、持续交付工具&#xff0c;用于自动化部署应用程序到 Kubernetes 集群。它基于 GitOps 理念&#xff0c;通过使用 Git 作为单一的源头来管理应用程序的配置和部署状态&#xff0c;argocd会定时监控git仓库中的yaml配置文件&#xff0c;当git仓库中…

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…

【JVM】JVM简介

文章目录 &#x1f334;简介&#x1f332;JVM发展史&#x1f338;Sun Classic VM&#x1f338;Exact VM&#x1f338;HotSpot VM&#x1f338;JRockit&#x1f338;J9 JVMTaobao JVM&#xff08;国产研发&#xff09; &#x1f333;JVM 运行流程⭕总结 &#x1f334;简介 JVM …

精酿啤酒:特殊酵母的发酵特性与风味表现

Fendi Club啤酒在酿造过程中采用了特殊的酵母&#xff0c;这些酵母具有与众不同的发酵特性和风味表现&#xff0c;为啤酒带来了与众不同的风味和口感。 Fendi Club啤酒使用的酵母种类繁多&#xff0c;包括艾尔酵母和拉格酵母等。这些不同种类的酵母在发酵过程中具有不同的特性和…

靠谱服装库存管理系统大盘点,商陆花、管家婆、秦丝哪家强?

在服装行业&#xff0c;库存管理是至关重要的环节。对于咱服装老板来说&#xff0c;选对的库存管理系统是提高效率、降低运营成本的关键。市场里有不少系统&#xff0c;我们今天拿出来最常见的5款&#xff0c;给大家一个详细指南。 选择服装库存管理系统时应考虑以下因素&…