当前位置: 首页 > news >正文

鸿蒙ArkTs使用axios发起网络请求并对请求参数加密

下载安装axios

ohpm install @ohos/axios

需要权限

{"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET","reason": "$string:permission_internet","usedScene": {"abilities": ["EntryAbility"],//inuse(使用时)、always(始终)。"when": "inuse"}}]}
}

AES加密数据:

  //参数排序后序列化let jsonParams: string = JSON.stringify(obj)Logger.debug(TAG, jsonParams)//生成aes秘钥//创建秘钥生成器let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')// 通过非对称密钥生成器,随机生成非对称密钥let promiseSymKey = symKeyGenerator.generateSymKeySync();//转换成可以读懂的字符串let key = buffer.from(promiseSymKey.getEncoded().data).toString('hex').substring(0, 16);//创建ivlet iv = key.substring(0, 16);let ivParam: cryptoFramework.IvParamsSpec = {algName: 'IvParamsSpec',iv: {data: new Uint8Array(buffer.from(iv).buffer)}}//convertKey方法是通过秘钥生成symKeylet symKey = symKeyGenerator.convertKeySync({ data: new Uint8Array(buffer.from(key).buffer) });//创建cipherlet cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');//创建cipher之后才能初始化cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam);let output = cipher.doFinalSync({ data: new Uint8Array(buffer.from(jsonParams, 'utf-8').buffer) })let base64: util.Base64Helper = new util.Base64Helper();//加密后的数据let aesParams = base64.encodeToStringSync(output.data);

RSA加密数据:

  //RSA加密aes秘钥//将公钥转换let symKeyBlob: crypto.DataBlob = { data: base64.decodeSync(PUBLIC_KEY) };let aesGenerator = crypto.createAsyKeyGenerator('RSA1024');let pubPair = aesGenerator.convertKeySync(symKeyBlob, null);//生成加密器let encoder = crypto.createCipher('RSA1024|PKCS1');//初始化加密环境encoder.initSync(crypto.CryptoMode.ENCRYPT_MODE, pubPair.pubKey, null);//封装加密所需数据let encode = new util.TextEncoder();//开始加密let updateOutput = encoder.doFinalSync({ data: encode.encodeInto(key) });//转换字符串let rsaKay = buffer.from(updateOutput.data).toString("base64");//写入请求头config.headers[CryptoConstant.PRIVATE_KEY] = rsaKay;

加载中弹窗

import { ComponentContent, PromptAction } from '@kit.ArkUI';class LoadingManager {contentNode: ComponentContent<Object> | undefined = undefined;promptAction: PromptAction | undefined = undefined;isShowing: number = 0show(uiContext: UIContext) {this.isShowing++;this.contentNode = new ComponentContent(uiContext, wrapBuilder(Loading));this.promptAction = uiContext.getPromptAction();this.promptAction.openCustomDialog(this.contentNode, {alignment: DialogAlignment.Center})}hide() {this.isShowing--;if (this.isShowing <= 0) {if (this.promptAction) {this.promptAction.closeCustomDialog(this.contentNode)}}}
}let loadingManager = new LoadingManager()export default loadingManager;@Builder
function Loading() {Column() {LoadingProgress().width($r('app.string.dimensions_50')).height($r('app.string.dimensions_50')).color(Color.White)}.width($r('app.string.dimensions_50')).height($r('app.string.dimensions_50')).backgroundColor($r('app.color.bg_00000000')).justifyContent(FlexAlign.Center)
}

完整AxiosHttp.ets

import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, Method } from '@ohos/axios';import { GlobalThis, Logger, StringBuilder, StrUtil, ToastUtil } from '@yunkss/eftool';
import { ResponseBaseResult, ResponseResult } from '../model/ResponseResult';
import { deviceInfo, emitter, systemDateTime } from '@kit.BasicServicesKit';
import { ContentType } from '../constant/CommonConstant';
import { HttpConstant } from '../constant/HttpConstant';
import { HttpConfig } from '../utils/HttpConfig';
import { UserManager } from './UserManager';
import { buffer, TreeMap, util } from '@kit.ArkTS';
import { CryptoConstant } from '../constant/CryptoConstant';
import BuildProfile from '../../../../BuildProfile';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { EmitterConstants } from '../constant/EmitterConstants';
import loadingManager from './LoadingManager';
import crypto from '@ohos.security.cryptoFramework';const TAG: string = "HttpUtil:  "
const PUBLIC_KEY = "MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGj8WNUSzCn0rHqfIXk9XPdJp60u\n" +"JnM+mVZVxY1lZmUCVA7t3eJZ0R0z1hUHkVb51eryDZcsz0QLSav3cmQv00ullK18\n" +"8aOs2SXZe6rcQf6XmOsVBqgADkrN+WePZJmb5Fr0NUkQ/sr7+R71cDZ87Y9QKm99\n" +"8BFOiWoEGxWWvDsTAgMBABF=";export function httpDefaultSetting() {// default settingsaxios.defaults.baseURL = HttpConfig.BASE_URL;axios.defaults.timeout = HttpConstant.HTTP_TIMEOUT;// default headers//设备相关axios.defaults.headers.common['os'] = 'harmoney';axios.defaults.headers.common['device'] = deviceInfo.marketName;//用户相关axios.defaults.headers.common["token"] = UserManager.getToken();axios.defaults.headers.common["Authorization"] = UserManager.getToken();// for postaxios.defaults.headers.post['Content-Type'] = ContentType.APPLICATION_JSON// 添加请求拦截器axios.interceptors.request.use((config: InternalAxiosRequestConfig) => {return transRequest(config);}, (error: AxiosError) => {return Promise.reject(error);});// 添加响应拦截器axios.interceptors.response.use((response: AxiosResponse) => {return transResponse(response);}, (error: AxiosError) => {return Promise.reject(error);});
}/*** 在这里处理请求体的拦截器操作逻辑*/
async function transRequest(config: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> {try {Logger.debug(TAG, "------------------Request------------------");Logger.debug(TAG, "httpUrl: " + config.baseURL + config.url);Logger.debug(TAG, "headers: " + JSON.stringify(config.headers));syncCryptoDataBySys(config)} catch (error) {let e: Error = error as ErrorLogger.error(TAG, e.message)} finally {return config;}
}/*** 在这里处理请求结果的拦截器操作逻辑*/
function transResponse(response: AxiosResponse): AxiosResponse {try {if (isSuccess(response)) {let data: ResponseBaseResult = response.data as ResponseBaseResultswitch (data.code) {case HttpConstant.HTTP_OK:case HttpConstant.HTTP_OK_200:breakcase HttpConstant.HTTP_LOGOUT:// 退出登录emitter.emit({ eventId: EmitterConstants.LOGIN_OUT }, {data: {msg: data.msg,}});breakdefault:if (data.msg != null && data.msg.length != 0) {ToastUtil.showToast(data.msg)}break}} else {ToastUtil.showToast(!StrUtil.isEmpty(response.statusText) ? response.statusText : $r('app.string.http_error_msg'))}return response;} catch (error) {let e: Error = error as ErrorToastUtil.showToast(!StrUtil.isEmpty(e.message) ? e.message : $r('app.string.http_error_msg'))return response;}
}export function httpGet<D>(url: string, config?: AxiosRequestConfig<D>,): Promise<D> {Logger.debug(TAG, "httpGet: ");let uiContext = GlobalThis.getInstance().getContext("EntryAbility")?.windowStage.getMainWindowSync().getUIContext()if (uiContext != undefined) {loadingManager.show(uiContext)}return new Promise<D>((resolve: Function, reject: Function) => {let startTime = systemDateTime.getTime()axios.get<ResponseResult<D>, AxiosResponse<ResponseResult<D>>, null>(url, {baseURL: config?.baseURL,headers: config?.headers,// 指定请求超时的毫秒数(0 表示无超时时间)timeout: HttpConstant.HTTP_TIMEOUT,params: config?.params,}).then((response: AxiosResponse<ResponseResult<D>>) => {let duration = (systemDateTime.getTime() - startTime).toString()Logger.debug(TAG, "------------------Response------------------");Logger.debug(TAG, "httpUrl" + config?.baseURL + config?.url);Logger.debug(TAG, "httpGet Success duration=" + duration);Logger.debug(TAG, "config=" + JSON.stringify(response.config));Logger.debug(TAG, "status=" + response.status);Logger.debug(TAG, "headers=" + JSON.stringify(response.headers));Logger.debug(TAG, "data=" + JSON.stringify(response.data));Logger.debug(TAG, "-------------------------------------------");if (isSuccess(response)) {if (isResultSuccess(response.data)) {resolve(response.data.data);} else {const e: Error = { name: `${response.data.code}`, message: `${response.data.msg}` }reject(e);}} else {const e: Error = { name: `${response.status}`, message: `${response.statusText}` }reject(e);}loadingManager.hide()}).catch((reason: AxiosError) => {Logger.error(TAG, "httpUrl" + config?.baseURL + config?.url);Logger.error(TAG, JSON.stringify(reason));reject(reason)loadingManager.hide()})});
}export function httpPost<D>(url: string, data?: ESObject, config?: AxiosRequestConfig<D>,isFormUrlencoded: boolean = true): Promise<D> {let uiContext = GlobalThis.getInstance().getContext("EntryAbility")?.windowStage.getMainWindowSync().getUIContext()if (uiContext != undefined) {loadingManager.show(uiContext)}return new Promise<D>((resolve: Function, reject: Function) => {let startTime = systemDateTime.getTime()let requestData: ESObject = isFormUrlencoded ? getRequestFormData(data ?? config?.data) : data ?? config?.dataaxios.post(url,requestData,{baseURL: config?.baseURL,headers: buildPostRequestHeader(isFormUrlencoded, config?.headers),// 指定请求超时的毫秒数(0 表示无超时时间)timeout: HttpConstant.HTTP_TIMEOUT,params: config?.params,}).then((response: AxiosResponse<ResponseResult<D>>) => {let duration = (systemDateTime.getTime() - startTime).toString()Logger.debug(TAG, "------------------Response------------------");Logger.debug(TAG, "httpUrl" + config?.baseURL + config?.url);Logger.debug(TAG, "httpPost Success duration=" + duration);Logger.debug(TAG, "config=" + JSON.stringify(response.config));Logger.debug(TAG, "status=" + response.status);Logger.debug(TAG, "headers=" + JSON.stringify(response.headers));Logger.debug(TAG, "data=" + JSON.stringify(response.data));Logger.debug(TAG, "-------------------------------------------");if (isSuccess(response)) {if (isResultSuccess(response.data)) {resolve(response.data.data);} else {const e: Error = { name: `${response.data.code}`, message: `${response.data.msg}` }reject(e);}} else {const e: Error = { name: `${response.status}`, message: `${response.statusText}` }reject(e);}loadingManager.hide()}).catch((reason: AxiosError) => {Logger.error(TAG, "httpUrl" + config?.baseURL + config?.url);Logger.error(TAG, JSON.stringify(reason));reject(reason)loadingManager.hide()})})
}export function httpRequest<D>(url: string, method?: Method | string, data?: D,config?: AxiosRequestConfig<D>): Promise<ResponseResult<D>> {let uiContext = GlobalThis.getInstance().getContext("EntryAbility")?.windowStage.getMainWindowSync().getUIContext()if (uiContext != undefined) {loadingManager.show(uiContext)}return new Promise<ResponseResult<D>>((resolve: Function, reject: Function) => {let startTime = systemDateTime.getTime()axios.request<ResponseResult<D>, AxiosResponse<ResponseResult<D>>, D>({url: url,method: method,baseURL: config?.baseURL,headers: config?.headers,// 指定请求超时的毫秒数(0 表示无超时时间)timeout: HttpConstant.HTTP_TIMEOUT,params: config?.params,data: data ?? config?.data}).then((response: AxiosResponse<ResponseResult<D>>) => {let duration = (systemDateTime.getTime() - startTime).toString()Logger.debug(TAG, "------------------Response------------------");Logger.debug(TAG, "httpUrl" + config?.baseURL + config?.url);Logger.debug(TAG, "httpRequest Success duration=" + duration);Logger.debug(TAG, "config=" + JSON.stringify(response.config));Logger.debug(TAG, "status=" + response.status);// Logger.debug(TAG, "statusText=" + response.statusText); // always empty??Logger.debug(TAG, "headers=" + JSON.stringify(response.headers));Logger.debug(TAG, "data=" + JSON.stringify(response.data));Logger.debug(TAG, "-------------------------------------------");if (isSuccess(response)) {if (isResultSuccess(response.data)) {resolve(response.data.data);} else {const e: Error = { name: `${response.data.code}`, message: `${response.data.msg}` }reject(e);}} else {const e: Error = { name: `${response.status}`, message: `${response.statusText}` }reject(e);}loadingManager.hide()}).catch((reason: AxiosError) => {Logger.error(TAG, "httpUrl" + config?.baseURL + config?.url);Logger.error(TAG, JSON.stringify(reason));reject(reason)loadingManager.hide()})});
}function getRequestFormData(data?: ESObject): string | undefined {if (data == undefined) {return undefined;}let sb = new StringBuilder();let keys = Object.keys(data);keys.forEach((key: string) => {sb.append(`${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)if (keys.indexOf(key) != keys.length - 1) {sb.append('&')}})let formData = sb.toString();return formData;
}function buildPostRequestHeader(isFormUrlencoded: boolean,headers?: Record<ESObject, ESObject>): Record<ESObject, ESObject> {if (headers != null) {headers['Content-Type'] = isFormUrlencoded ? ContentType.APPLICATION_FORM : ContentType.APPLICATION_JSONreturn headers}return {'Content-Type': isFormUrlencoded ? ContentType.APPLICATION_FORM : ContentType.APPLICATION_JSON,}
}function isSuccess(response: AxiosResponse): boolean {return response.status >= 200 && response.status < 300
}function isResultSuccess(result: ResponseBaseResult): boolean {return result.code == HttpConstant.HTTP_OK
}// 同步加密数据
export function syncCryptoDataBySys(config: InternalAxiosRequestConfig) {let treeMap: TreeMap<string, string> = new TreeMap()let data = StrUtil.asString(config.data)let params: string[] | undefined = data?.split("&")if (params != undefined) {params.forEach(param => {let paramKV: string[] = param.split("=")treeMap.set(paramKV[0], paramKV[1])})}let obj: Record<string, string> = {};for (let entry of treeMap.entries()) {obj[Object(entry)[0]] = Object(entry)[1];}//参数排序后序列化let jsonParams: string = JSON.stringify(obj)Logger.debug(TAG, jsonParams)//AES加密//创建秘钥生成器let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')// 通过非对称密钥生成器,随机生成非对称密钥let promiseSymKey = symKeyGenerator.generateSymKeySync();//转换成可以读懂的字符串let key = buffer.from(promiseSymKey.getEncoded().data).toString('hex').substring(0, 16);//创建ivlet iv = key.substring(0, 16);let ivParam: cryptoFramework.IvParamsSpec = {algName: 'IvParamsSpec',iv: {data: new Uint8Array(buffer.from(iv).buffer)}}//convertKey方法是通过秘钥生成symKeylet symKey = symKeyGenerator.convertKeySync({ data: new Uint8Array(buffer.from(key).buffer) });//创建cipherlet cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');//创建cipher之后才能初始化cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam);let output = cipher.doFinalSync({ data: new Uint8Array(buffer.from(jsonParams, 'utf-8').buffer) })let base64: util.Base64Helper = new util.Base64Helper();//加密后的数据let aesParams = base64.encodeToStringSync(output.data);//写入请求体config.data = encodeURIComponent(CryptoConstant.SIGN) + "=" + encodeURIComponent(aesParams);//RSA加密aes秘钥//将公钥转换let symKeyBlob: crypto.DataBlob = { data: base64.decodeSync(PUBLIC_KEY) };let aesGenerator = crypto.createAsyKeyGenerator('RSA1024');let pubPair = aesGenerator.convertKeySync(symKeyBlob, null);//生成加密器let encoder = crypto.createCipher('RSA1024|PKCS1');//初始化加密环境encoder.initSync(crypto.CryptoMode.ENCRYPT_MODE, pubPair.pubKey, null);//封装加密所需数据let encode = new util.TextEncoder();//开始加密let updateOutput = encoder.doFinalSync({ data: encode.encodeInto(key) });//转换字符串let rsaKay = buffer.from(updateOutput.data).toString("base64");//写入请求头config.headers[CryptoConstant.PRIVATE_KEY] = rsaKay;Logger.debug(TAG, CryptoConstant.SIGN + ": " + aesParams)Logger.debug(TAG, CryptoConstant.PRIVATE_KEY + ": " + rsaKay)
}

接口示例:

  // 登录login() {if (StrUtil.isEmpty(this.phone)) {ToastUtil.showToast($r('app.string.empty_phone_hint'))return}if (StrUtil.isEmpty(this.smsCode)) {ToastUtil.showToast($r('app.string.empty_sms_code_hint'))return}if (!this.isAgreeProtocol) {ToastUtil.showToast($r('app.string.agree_protocol_hint'))return}httpPost<LoginTokenModel>(HttpConfig.LLCB_LOGIN_TO_LOGIN, {phone: this.phone,smsCode: this.smsCode,client_id: LoginConstants.client_id,grant_type: LoginConstants.grant_type_sms,client_secret: LoginConstants.client_secret,userType: LoginConstants.userType,osType: LoginConstants.osType,}, {baseURL: HttpConfig.BASE_URL_THIRD_LOGIN_IP}).then((loginTokenModel) => {Logger.error("LoginPage ", JSONUtil.toJSONString(loginTokenModel))}).catch((e: Error) => {Logger.error("LoginPage ", e.message)})}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 系统架构不是设计出来的
  • 华为OD机试-周末爬山(JavaPythonC++)100%通过率,最新E卷题目
  • 【Oracle点滴积累】解决ORA-29913和KUP-04095: preprocessor command的方法
  • DBSCAN算法及Python实践
  • 2.pandas--读取文件夹中所有excel文件进行合并
  • 芯片后端之 PT 使用 report_timing 产生报告 之 -input_pins 选项
  • Linux编程: C++程序线程CPU使用率监控与分析小工具
  • 企业高性能web服务器(nginx)
  • 【TB作品】PIC16F1719单片机,EEPROM,PFM,读写,PIC16F1718/19
  • ST-LINK常见错误总结
  • 实现MySQL的主从复制基础
  • 如何保证Redis与数据库之间的一致性
  • C/C++ 线程局部存储(TLS)
  • vue3+vite配置环境变量实现开发、测试、生产的区分
  • 利用Matlab求解常微分方程(dsolve与ode45)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【css3】浏览器内核及其兼容性
  • exif信息对照
  • golang中接口赋值与方法集
  • gulp 教程
  • Lsb图片隐写
  • mongodb--安装和初步使用教程
  • mysql外键的使用
  • opencv python Meanshift 和 Camshift
  • React-flux杂记
  • Vue 动态创建 component
  • vue脚手架vue-cli
  • 初识MongoDB分片
  • 动态规划入门(以爬楼梯为例)
  • 关于Flux,Vuex,Redux的思考
  • 深度学习中的信息论知识详解
  • 通过git安装npm私有模块
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 智能合约开发环境搭建及Hello World合约
  • elasticsearch-head插件安装
  • puppet连载22:define用法
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #、%和$符号在OGNL表达式中经常出现
  • #100天计划# 2013年9月29日
  • #162 (Div. 2)
  • #职场发展#其他
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (30)数组元素和与数字和的绝对差
  • (AngularJS)Angular 控制器之间通信初探
  • (javascript)再说document.body.scrollTop的使用问题
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (函数)颠倒字符串顺序(C语言)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十八)Flink CEP 详解
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)Linux整合apache和tomcat构建Web服务器
  • .NET Project Open Day(2011.11.13)