0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-03-27 17:35 次阅读

需求:加载验证码;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开发更多内容↓点击HarmonyOSOpenHarmony技术
鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。或+mau123789学习,是v喔

方法一:

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

资料拿取+mau123789vhttpRequest.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;

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

运行日志:

cke_2126.png

运行效果:

cke_6226.png

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    79

    文章

    1977

    浏览量

    30253
  • OpenHarmony
    +关注

    关注

    25

    文章

    3724

    浏览量

    16351
  • 鸿蒙OS
    +关注

    关注

    0

    文章

    188

    浏览量

    4421
收藏 人收藏

    评论

    相关推荐

    用基于gin框架的Go语言来实现手机号发送短信验证码登录

    现在大多数app或wap都实现了通过手机号获取验证码进行验证登录,下面来看下用go来实现手机号发送短信验证码登录的过程,基于的框架是gin 。
    的头像 发表于 07-20 09:36 4461次阅读
    用基于gin<b class='flag-5'>框架</b>的Go语言来实现手机号发送短信<b class='flag-5'>验证码</b>登录

    鸿蒙原生应用/元服务开发-Serverless账户验证码的问题

    在应用/元服务早期使用过程中,-Serverless账户验证码的格式是[AGC][应用/元服务名称],如下图。 但是,在最近,[应用/元服务]名称直接变成了【default】,用户收到这种验证码后,心里存有疑虑的,这是哪里配置或者设置的问题吗?大家有遇到同样的问题吗?如何
    发表于 12-27 15:55

    无法验证邮箱,总是提示验证码错误,验证码明明是正确的。

    `无法验证邮箱,总是提示验证码错误,验证码明明是正确的。是不是系统的bug?`
    发表于 05-12 10:41

    平台是如何高效的破解市面上各家验证码平台的各种形式验证码的?

    验证码与打平台的对抗讲起。何为打平台?打平台的基本原理是利用人工智能技术实现对验证码设计原理的突破。其工作流程如下图所示:以前黑灰产要
    发表于 11-01 15:21

    多样变换的手写验证码自动识别算法

    研究验证码自动识别技术可以进一步提升人识别验证码的可读性,增强机器识别的难度,从而提高网络安全性。针对目前提出的验证码识别方法基本都是采用光学字符识别(OCR)方法对机器写的标准字符进
    发表于 12-20 14:14 0次下载

    SQLyog_12.4.1_带验证码

    SQLyog_12.4.1_带验证码.rar
    发表于 04-12 21:03 22次下载

    以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别

    很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。本文以一个真实网站的验证码为例,实现了基于一下KNN的验证码识别。
    的头像 发表于 12-24 17:27 7783次阅读

    验证码层出不穷?试试这个自动跳过验证码的工具

    目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人也经常没法辨认!这就相当烦了,特别是被广泛使
    的头像 发表于 11-15 10:42 5988次阅读

    验证码太麻烦,自动跳过验证码神器试一试

    目前网络上越来越多使用验证码了,验证码的本意是阻止机器刷流量挤占服务器资源,这本来无可厚非;但是验证码已经变得越来越过分,别说机器人了,连人也经常没法辨认! 这就相当烦了,特别是被广泛
    的头像 发表于 11-15 11:15 1w次阅读

    OpenHarmony上使用的Http网络框架教程

    简介 鸿蒙上使用的Http网络框架,里面包含纯Java实现的HttpNet,类似okhttp使用,支持同步和异步两种请求方式;还有
    发表于 04-12 11:13 4次下载

    一个短信验证码爆破重置

    以前倒是遇到过不少四位数验证码爆破的,但是这种可以结合短信遍历,一个短信验证码只能验证三次的,最后能成功利用的还是第一次遇到,关键还是这里不存在图片验证码或者行为
    的头像 发表于 09-07 09:14 5095次阅读

    验证码到底在验证啥?聊一聊验证码是怎么为难我们人类的

    在文章开头,老狐先给大家玩一个验证码的游戏,猜出图中验证码字母。
    的头像 发表于 08-12 10:25 2118次阅读
    <b class='flag-5'>验证码</b>到底在<b class='flag-5'>验证</b>啥?聊一聊<b class='flag-5'>验证码</b>是怎么为难我们人类的

    Java 中验证码的使用

    今天我们讲一下在 Java 中验证码的使用。 验证码生成 本效果是利用easy-captcha工具包实现,首先需要添加相关依赖到pom.xml中,代码如下: com .github.whvcse
    的头像 发表于 09-25 11:11 1050次阅读
    Java 中<b class='flag-5'>验证码</b>的使用

    SpringBoot分布式验证码登录方案

    传统的项目大都是基于session交互的,前后端都在一个项目里面,比如传统的SSH项目或者一些JSP系统,当前端页面触发到获取验证码请求,可以将验证码里面的信息存在上下文中,所以登录的时候只需要 用户名、密码、
    的头像 发表于 10-12 17:34 729次阅读
    SpringBoot分布式<b class='flag-5'>验证码</b>登录方案

    鸿蒙OS开发实例:【HarmonyHttpClient】网络框架

    鸿蒙上使用的Http网络框架,里面包含纯Java实现的HttpNet,类似okhttp使用,支持同步和异步两种请求方式;还有
    的头像 发表于 04-12 16:58 845次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b>开发实例:【HarmonyHttpClient】<b class='flag-5'>网络</b><b class='flag-5'>框架</b>