需求:加載驗證碼;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請求先返回??梢愿鶕I務需要訂閱此消息
});
方法二:
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瀏覽量
30257 -
OpenHarmony
+關注
關注
25文章
3725瀏覽量
16368 -
鴻蒙OS
+關注
關注
0文章
189瀏覽量
4424
發布評論請先 登錄
相關推薦
用基于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系統,當前端頁面觸發到獲取驗證碼請求,可以將驗證碼里面的信息存在上下文中,所以登錄的時候只需要 用戶名、密碼、
評論