0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙OS(ArkTS) 案例:【使用http網(wǎng)絡請求框架加載驗證碼】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-27 17:35 ? 次閱讀

需求:加載驗證碼;1.下載驗證碼圖像文件;2.獲取header里面驗證碼ID

踩坑--踩坑--踩坑

根據(jù)文檔使用 request.downloadFile 請求,官方示例:

// pages/xxx.ets
// 將網(wǎng)絡資源文件下載到應用文件目錄并讀取一段內(nèi)容
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 無法獲取....只能換常規(guī)方法獲取了。

換 httpRequest.request 來請求,示例代碼如下:

/**
   * 下載文件(驗證碼使用)
   */
  static httpFileDownload(url: string, params?: any): Promise< ResponseResultJson > {
    LogUtils.i("下載文件URL:" + url + "n請求參數(shù):" + (params != undefined ? "n請求參數(shù):" + JSON.stringify(params) : "無參數(shù)"));
    //
    let httpRequest = http.createHttp();
    httpRequest.on('headersReceive', (header) = > {
      //用于訂閱HTTP響應頭,此接口會比request請求先返回。可以根據(jù)業(yè)務需要訂閱此消息
    });
    //
    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, // 可選,指定返回數(shù)據(jù)的類型
      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) //創(chuàng)建目錄
        //
        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); //將數(shù)據(jù)寫入文件
        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 = "業(yè)務異常:" + 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開發(fā)更多內(nèi)容↓點擊HarmonyOSOpenHarmony技術
鴻蒙技術文檔開發(fā)知識更新庫gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在這。或+mau123789學習,是v喔

方法一:

搜狗高速瀏覽器截圖20240326151547.png

資料拿取+mau123789vhttpRequest.on('headersReceive', (header) = > {
      //用于訂閱HTTP響應頭,此接口會比request請求先返回??梢愿鶕?jù)業(yè)務需要訂閱此消息
    });

方法二:

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.參數(shù)里面的 expectDataType 需要設置為 http.HttpDataType.ARRAY_BUFFER;

  1. 結果轉換為ArrayBuffer,let result = responseResult.result as ArrayBuffer

運行日志:

cke_2126.png

運行效果:

cke_6226.png

完畢啦?。。?! 驗證碼獲取成功了?。。?!

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HarmonyOS
    +關注

    關注

    79

    文章

    1975

    瀏覽量

    30209
  • OpenHarmony
    +關注

    關注

    25

    文章

    3722

    瀏覽量

    16323
  • 鴻蒙OS
    +關注

    關注

    0

    文章

    188

    瀏覽量

    4400
收藏 人收藏

    評論

    相關推薦

    用基于gin框架的Go語言來實現(xiàn)手機號發(fā)送短信驗證碼登錄

    現(xiàn)在大多數(shù)app或wap都實現(xiàn)了通過手機號獲取驗證碼進行驗證登錄,下面來看下用go來實現(xiàn)手機號發(fā)送短信驗證碼登錄的過程,基于的框架是gin 。
    的頭像 發(fā)表于 07-20 09:36 ?4452次閱讀
    用基于gin<b class='flag-5'>框架</b>的Go語言來實現(xiàn)手機號發(fā)送短信<b class='flag-5'>驗證碼</b>登錄

    鴻蒙原生應用/元服務開發(fā)-Serverless賬戶驗證碼的問題

    在應用/元服務早期使用過程中,-Serverless賬戶驗證碼的格式是[AGC][應用/元服務名稱],如下圖。 但是,在最近,[應用/元服務]名稱直接變成了【default】,用戶收到這種驗證碼后,心里存有疑慮的,這是哪里配置或者設置的問題嗎?大家有遇到同樣的問題嗎?如何
    發(fā)表于 12-27 15:55

    無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。

    `無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。是不是系統(tǒng)的bug?`
    發(fā)表于 05-12 10:41

    平臺是如何高效的破解市面上各家驗證碼平臺的各種形式驗證碼的?

    驗證碼與打平臺的對抗講起。何為打平臺?打平臺的基本原理是利用人工智能技術實現(xiàn)對驗證碼設計原理的突破。其工作流程如下圖所示:以前黑灰產(chǎn)要
    發(fā)表于 11-01 15:21

    多樣變換的手寫驗證碼自動識別算法

    研究驗證碼自動識別技術可以進一步提升人識別驗證碼的可讀性,增強機器識別的難度,從而提高網(wǎng)絡安全性。針對目前提出的驗證碼識別方法基本都是采用光學字符識別(OCR)方法對機器寫的標準字符進
    發(fā)表于 12-20 14:14 ?0次下載

    SQLyog_12.4.1_帶驗證碼

    SQLyog_12.4.1_帶驗證碼.rar
    發(fā)表于 04-12 21:03 ?22次下載

    以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別

    很多網(wǎng)站登錄都需要輸入驗證碼,如果要實現(xiàn)自動登錄就不可避免的要識別驗證碼。本文以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別。
    的頭像 發(fā)表于 12-24 17:27 ?7778次閱讀

    驗證碼層出不窮?試試這個自動跳過驗證碼的工具

    目前網(wǎng)絡上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機器人了,連人也經(jīng)常沒法辨認!這就相當煩了,特別是被廣泛使
    的頭像 發(fā)表于 11-15 10:42 ?5976次閱讀

    驗證碼太麻煩,自動跳過驗證碼神器試一試

    目前網(wǎng)絡上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機器人了,連人也經(jīng)常沒法辨認! 這就相當煩了,特別是被廣泛
    的頭像 發(fā)表于 11-15 11:15 ?1w次閱讀

    OpenHarmony上使用的Http網(wǎng)絡框架教程

    簡介 鴻蒙上使用的Http網(wǎng)絡框架,里面包含純Java實現(xiàn)的HttpNet,類似okhttp使用,支持同步和異步兩種請求方式;還有
    發(fā)表于 04-12 11:13 ?4次下載

    一個短信驗證碼爆破重置

    以前倒是遇到過不少四位數(shù)驗證碼爆破的,但是這種可以結合短信遍歷,一個短信驗證碼只能驗證三次的,最后能成功利用的還是第一次遇到,關鍵還是這里不存在圖片驗證碼或者行為
    的頭像 發(fā)表于 09-07 09:14 ?5089次閱讀

    驗證碼到底在驗證啥?聊一聊驗證碼是怎么為難我們?nèi)祟惖?/a>

    在文章開頭,老狐先給大家玩一個驗證碼的游戲,猜出圖中驗證碼字母。
    的頭像 發(fā)表于 08-12 10:25 ?2109次閱讀
    <b class='flag-5'>驗證碼</b>到底在<b class='flag-5'>驗證</b>啥?聊一聊<b class='flag-5'>驗證碼</b>是怎么為難我們?nèi)祟惖? />    </a>
</div>                            <div   id=

    Java 中驗證碼的使用

    今天我們講一下在 Java 中驗證碼的使用。 驗證碼生成 本效果是利用easy-captcha工具包實現(xiàn),首先需要添加相關依賴到pom.xml中,代碼如下: com .github.whvcse
    的頭像 發(fā)表于 09-25 11:11 ?1049次閱讀
    Java 中<b class='flag-5'>驗證碼</b>的使用

    SpringBoot分布式驗證碼登錄方案

    傳統(tǒng)的項目大都是基于session交互的,前后端都在一個項目里面,比如傳統(tǒng)的SSH項目或者一些JSP系統(tǒng),當前端頁面觸發(fā)到獲取驗證碼請求,可以將驗證碼里面的信息存在上下文中,所以登錄的時候只需要 用戶名、密碼、
    的頭像 發(fā)表于 10-12 17:34 ?727次閱讀
    SpringBoot分布式<b class='flag-5'>驗證碼</b>登錄方案

    鴻蒙OS開發(fā)實例:【HarmonyHttpClient】網(wǎng)絡框架

    鴻蒙上使用的Http網(wǎng)絡框架,里面包含純Java實現(xiàn)的HttpNet,類似okhttp使用,支持同步和異步兩種請求方式;還有
    的頭像 發(fā)表于 04-12 16:58 ?836次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b>開發(fā)實例:【HarmonyHttpClient】<b class='flag-5'>網(wǎng)絡</b><b class='flag-5'>框架</b>