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

    文章

    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

    什么时候才能发帖不需要验证码?

    每次发帖都要验证码,什么时候才能发帖不需要验证码?
    发表于 06-04 19:17

    12306图片验证码难倒了谁?

    ``近日,朋友圈多出现抢票验证码的刷屏,多地多方向的春运火车票进入“秒杀”状态,根据最长60天的预售期,12月10日(本周四)将开售除夕火车票,归家的游子将面临售票高峰。然而,要想“秒杀”到一张车票
    发表于 12-08 10:29

    论坛注册时不显示验证码

    论坛注册时不显示验证码啊,提交时提示验证码错误,希望早点解决,这是用别人的号发的!!!!!!!!!!!
    发表于 03-01 21:45

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

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

    为什么短信验证码在我们生活中频频出现

    随着时代的进步和科学技术的发展,越来越多的企业已经离不开短信验证码发送平台了,因为它可以帮助企业处理大量的用户信息,提高接收短信验证码的经验意识。大型网站提供了短信验证码功能,更准确、更安全地保证了
    发表于 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、状态管理等相应的能
    的头像 发表于 01-24 16:44 599次阅读
    <b class='flag-5'>鸿蒙</b>开发之<b class='flag-5'>ArkTS</b>基础知识

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

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