需求:加载验证码;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文章
1977浏览量
30253 -
OpenHarmony
+关注
关注
25文章
3724浏览量
16351 -
鸿蒙OS
+关注
关注
0文章
188浏览量
4421
发布评论请先 登录
相关推荐
用基于gin框架的Go语言来实现手机号发送短信验证码登录
现在大多数app或wap都实现了通过手机号获取验证码进行验证登录,下面来看下用go来实现手机号发送短信验证码登录的过程,基于的框架是gin 。
鸿蒙原生应用/元服务开发-Serverless账户验证码的问题
在应用/元服务早期使用过程中,-Serverless账户验证码的格式是[AGC][应用/元服务名称],如下图。
但是,在最近,[应用/元服务]名称直接变成了【default】,用户收到这种验证码后,心里存有疑虑的,这是哪里配置或者设置的问题吗?大家有遇到同样的问题吗?如何
发表于 12-27 15:55
打码平台是如何高效的破解市面上各家验证码平台的各种形式验证码的?
验证码与打码平台的对抗讲起。何为打码平台?打码平台的基本原理是利用人工智能技术实现对验证码设计原理的突破。其工作流程如下图所示:以前黑灰产要
发表于 11-01 15:21
多样变换的手写验证码自动识别算法
研究验证码自动识别技术可以进一步提升人识别验证码的可读性,增强机器识别的难度,从而提高网络安全性。针对目前提出的验证码识别方法基本都是采用光学字符识别(OCR)方法对机器写的标准字符进
发表于 12-20 14:14
•0次下载
以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别
很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。本文以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别。
验证码层出不穷?试试这个自动跳过验证码的工具
目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人也经常没法辨认!这就相当烦了,特别是被广泛使
验证码太麻烦,自动跳过验证码神器试一试
目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人也经常没法辨认! 这就相当烦了,特别是被广泛
OpenHarmony上使用的Http网络框架教程
简介 鸿蒙上使用的Http网络框架,里面包含纯Java实现的HttpNet,类似okhttp使用,支持同步和异步两种请求方式;还有
发表于 04-12 11:13
•4次下载
一个短信验证码爆破重置
以前倒是遇到过不少四位数验证码爆破的,但是这种可以结合短信遍历,一个短信验证码只能验证三次的,最后能成功利用的还是第一次遇到,关键还是这里不存在图片验证码或者行为
Java 中验证码的使用
今天我们讲一下在 Java 中验证码的使用。 验证码生成 本效果是利用easy-captcha工具包实现,首先需要添加相关依赖到pom.xml中,代码如下: com .github.whvcse
SpringBoot分布式验证码登录方案
传统的项目大都是基于session交互的,前后端都在一个项目里面,比如传统的SSH项目或者一些JSP系统,当前端页面触发到获取验证码请求,可以将验证码里面的信息存在上下文中,所以登录的时候只需要 用户名、密码、
评论