需求:加载验证码;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.header
LogUtils.i('解析响应 header n' + JSON.stringify(header));
let headerJson = JSON.stringify(header)
let headerObj = JSON.parse(headerJson)
let sessionId = headerObj.sessionid as string
let serverModel = headerObj.servermodel as string
let encryptType = headerObj.encrypttype as string
//保存 header
await 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_SUCCESS
responseResultJson.isSuccess = true
responseResultJson.status = responseResult.responseCode
responseResultJson.serverModel = serverModel
responseResultJson.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 = false
return responseResultJson;
});
}复制
里面无用工具类可以不用在意...里面获取header可以有2种方法
鸿蒙OS开发 | 更多内容↓点击 | HarmonyOS与OpenHarmony技术 |
---|---|---|
鸿蒙技术文档 | 开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md 在这。 | 或+mau123789学习,是v喔 |
方法一:
资料拿取+mau123789是v喔
httpRequest.on('headersReceive', (header) = > {
//用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
});
方法二:
let header = responseResult.header
LogUtils.i('解析响应 header n' + JSON.stringify(header));
let headerJson = JSON.stringify(header)
let headerObj = JSON.parse(headerJson)
let sessionId = headerObj.sessionid as string
let serverModel = headerObj.servermodel as string
let encryptType = headerObj.encrypttype as string
获取的值是一样的。
获取验证码文件关键代码:
1.参数里面的 expectDataType 需要设置为 http.HttpDataType.ARRAY_BUFFER;
- 结果转换为ArrayBuffer,let result = responseResult.result as ArrayBuffer
运行日志:
运行效果:
完毕啦!!!! 验证码获取成功了!!!!
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
HarmonyOS
+关注
关注
79文章
1827浏览量
29261 -
OpenHarmony
+关注
关注
23文章
3284浏览量
15159 -
鸿蒙OS
+关注
关注
0文章
128浏览量
4279
发布评论请先 登录
相关推荐
鸿蒙原生应用/元服务开发-Serverless账户验证码的问题
在应用/元服务早期使用过程中,-Serverless账户验证码的格式是[AGC][应用/元服务名称],如下图。
但是,在最近,[应用/元服务]名称直接变成了【default】,用户收到这种验证码后,心里存有疑虑的,这是哪里配置或者设置的问题吗?大家有遇到同样的问题吗?如何
发表于 12-27 15:55
鸿蒙实战基础(ArkTS)-窗口管理
的createSubWindow接口,创建子窗口。
子窗口创建成功后,通过moveWindowTo和resize接口,设置子窗口的位置、大小及相关属性等。
调用setUIContent接口,为子窗口加载对应的验证码
发表于 01-12 17:51
织梦dedecms登陆提示“验证码不正确”的完整解决方案
很多朋友碰到了网站登陆的时候遇到了验证码不正确,考虑到刚刚设置了网站文件夹的权限,估计是权限不够造成的,后来经过了解,dedecms的验证码是data目录的session文件夹,在服务器上把
发表于 03-10 23:53
10种意想不到的验证码风格设计
本帖最后由 A670521546 于 2011-5-5 14:05 编辑
10种意想不到的验证码风格设计2011-04-29 09:34 | 15611次阅读 | 来源:开源中国社区 【已有
发表于 05-05 14:03
12306图片验证码难倒了谁?
``近日,朋友圈多出现抢票验证码的刷屏,多地多方向的春运火车票进入“秒杀”状态,根据最长60天的预售期,12月10日(本周四)将开售除夕火车票,归家的游子将面临售票高峰。然而,要想“秒杀”到一张车票
发表于 12-08 10:29
为什么短信验证码在我们生活中频频出现
随着时代的进步和科学技术的发展,越来越多的企业已经离不开短信验证码发送平台了,因为它可以帮助企业处理大量的用户信息,提高接收短信验证码的经验意识。大型网站提供了短信验证码功能,更准确、更安全地保证了
发表于 04-16 23:12
一文解析验证码与打码平台的攻防对抗
1、验证码与打码平台的攻防对抗 众所周知,验证码的出现是为了区分人和机器,但随着科技的发展,黑产从业者的可图之利增多,验证码的战场也进入了一段破解与抗破解的持久博弈。
发表于 09-28 11:02
打码平台是如何高效的破解市面上各家验证码平台的各种形式验证码的?
验证码与打码平台的对抗讲起。何为打码平台?打码平台的基本原理是利用人工智能技术实现对验证码设计原理的突破。其工作流程如下图所示:以前黑灰产要
发表于 11-01 15:21
【国民技术N32项目移植】手机验证码项目移植4--手机验证码计算
,再从device_id中取一位,一共6位作为验证码。TOTP算法依赖以下参数:device_id:设备id,实际项目中跟设备绑定,由服务器下发。t_utc:当前网络时间,是UTC时间,不是北京时间
发表于 02-24 14:45
OpenHarmony上使用的Http网络框架教程
简介 鸿蒙上使用的Http网络框架,里面包含纯Java实现的HttpNet,类似okhttp使用,支持同步和异步两种请求方式;还有
发表于 04-12 11:13
•4次下载
鸿蒙开发之ArkTS基础知识
一、ArkTS简介 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,匹配了鸿蒙的ArkUI框架,扩展了声明式UI、状态管理等相应的能
评论