新年新气象!!!祝大家新年快乐!!龙年大吉!
本文基于Api9开发至于为啥用API9 请看关于停用基于鸿蒙Api 8 开发-优快云博客
正文开始 直接上代码
1、参数加密
/**
* 请求加密
* @param json 参数
* @param key 秘钥
* @returns {string} 密文
* cipherAlgName 参考https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/cryptoframework-overview-0000001544583933-V2#ZH-CN_TOPIC_0000001573928893__%E5%8A%A0%E8%A7%A3%E5%AF%86%E8%A7%84%E6%A0%BC
*/
function requestEncrypt(json, key = AppConstant.SECRET) {
let cipherAlgName = 'AES256|CBC|PKCS7';
//创建秘钥生成器
let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256')
let ivParam: cryptoFramework.IvParamsSpec = {
algName: 'IvParamsSpec',
iv: {
//如果项目需要就将空字符替换
data: stringToUint8Array('', 32)
}
}
let cipher;
//convertKey方法是通过秘钥生成symKey
return symKeyGenerator.convertKey({
data: stringToUint8Array(key)
}).then(symKey => {
try {
//创建cipher
cipher = cryptoFramework.createCipher(cipherAlgName);
console.info(`xx cipher algName: ${cipher.algName}`);
} catch (error) {
console.error(`xx createCipher failed, ${error.code}, ${error.message}`);
return null
}
//创建cipher之后才能初始化
return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam)
.then(() => {
//创建cipher且初始化之后才能执行doFinal
return cipher.doFinal({
data: stringToUint8Array(JSON.stringify(json))
})
})
.then(output => {
let base64 = new util.Base64Helper();
let result = base64.encodeToStringSync(output.data);
return new Promise((resolve) => {
resolve(result)
})
}).catch(e => {
return new Promise((_, reject) => {
reject(e)
})
})
}).catch(e => {
return new Promise((_, reject) => {
reject(e)
})
})
}
/**
*把密钥、明文等转换成输入数据需要的格式
*/
function stringToUint8Array(str, len = null) {
let arr = [];
if (len == null) {
len = str.length
}
for (let i = 0; i < len; i++) {
if (str.length > i) {
arr.push(str.charCodeAt(i))
} else {
arr.push(0)
}
}
return new Uint8Array(arr);
}
2、参数解密
/**
* 解密
* @param str 密文
* @param key 私钥
* @returns {*|string} 明文
*/
function decrypt(str, key = AppConstant.SECRET) {
let cipherAlgName = 'AES256|CBC|PKCS7';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256')
let ivParam: cryptoFramework.IvParamsSpec = {
algName: 'IvParamsSpec',
iv: {
data: stringToUint8Array('', 32)
}
}
let cipher;
return symKeyGenerator.convertKey({
data: stringToUint8Array(key)
}).then(symKey => {
try {
cipher = cryptoFramework.createCipher(cipherAlgName);
console.info(`xx cipher algName: ${cipher.algName}`);
} catch (error) {
console.error(`xx createCipher failed, ${error.code}, ${error.message}`);
return null
}
return cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, ivParam)
.then(() => {
let base64 = new util.Base64Helper();
let result = base64.decodeSync(str);
return cipher.doFinal({
data: result
})
})
.then(output => {
let result = uint8ArrayToString(output.data)
return new Promise((resolve) => {
resolve(result)
})
}).catch(e => {
return new Promise((_, reject) => {
reject(e)
})
})
}).catch(e => {
return new Promise((_, reject) => {
reject(e)
})
})
}
/*
*解密内容转换成字符串
*/
function uint8ArrayToString(array) {
let arrayString = '';
for (let i = 0; i < array.length; i++) {
arrayString += String.fromCharCode(array[i]);
}
return arrayString;
}
3、网络请求
export async function httpRequestGet(url: string, formDataStrOrJson: object): Promise<ResponseResultModel> {
let httpRequest = http.createHttp();
let encryStr: string = await requestEncrypt(formDataStrOrJson)
let responseResult = httpRequest.request(url, {
method: http.RequestMethod.GET,
readTimeout: CommonConstant.HTTP_READ_TIMEOUT,
header: {
'Content-Type': ContentType.JSON
},
extraData: {
"data": encryStr
},
connectTimeout: CommonConstant.HTTP_READ_TIMEOUT,
});
let serverData: ResponseResultModel = new ResponseResultModel();
return responseResult.then(async (value: http.HttpResponse) => {
if (value.responseCode === CommonConstant.HTTP_CODE_200) {
let result = `${value.result}`;
let resultJson: ResponseResultModel = JSON.parse(result);
serverData.data = await decrypt(resultJson.data)
serverData.status = resultJson.status;
serverData.message = resultJson.message;
} else {
serverData.message = `${$r('app.string.http_error_message')}&${value.responseCode}`;
}
return serverData;
}).catch(() => {
serverData.message = $r('app.string.http_error_message');
return serverData;
})
}
///根据后端返回的参数自己替换返回参数
export class ResponseResultModel {
/**
* Code returned by the network request: success, fail.
*/
status: number;
/**
* Message returned by the network request.
*/
message: string | Resource;
/**
* Data returned by the network request.
*/
data: string | Object | ArrayBuffer;
constructor() {
this.status = 0;
this.message = '';
this.data = '';
}
}
4、完整代码
/**
* 请求加密
* @param json 参数
* @param key 秘钥
* @returns {string} 密文
* cipherAlgName 参考https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/cryptoframework-overview-0000001544583933-V2#ZH-CN_TOPIC_0000001573928893__%E5%8A%A0%E8%A7%A3%E5%AF%86%E8%A7%84%E6%A0%BC
*/
function requestEncrypt(json, key = AppConstant.SECRET) {
let cipherAlgName = 'AES256|CBC|PKCS7';
//创建秘钥生成器
let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256')
let ivParam: cryptoFramework.IvParamsSpec = {
algName: 'IvParamsSpec',
iv: {
//如果项目需要就将空字符替换
data: stringToUint8Array('', 32)
}
}
let cipher;
//convertKey方法是通过秘钥生成symKey
return symKeyGenerator.convertKey({
data: stringToUint8Array(key)
}).then(symKey => {
try {
//创建cipher
cipher = cryptoFramework.createCipher(cipherAlgName);
console.info(`xx cipher algName: ${cipher.algName}`);
} catch (error) {
console.error(`xx createCipher failed, ${error.code}, ${error.message}`);
return null
}
//创建cipher之后才能初始化
return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam)
.then(() => {
//创建cipher且初始化之后才能执行doFinal
return cipher.doFinal({
data: stringToUint8Array(JSON.stringify(json))
})
})
.then(output => {
let base64 = new util.Base64Helper();
let result = base64.encodeToStringSync(output.data);
return new Promise((resolve) => {
resolve(result)
})
}).catch(e => {
return new Promise((_, reject) => {
reject(e)
})
})
}).catch(e => {
return new Promise((_, reject) => {
reject(e)
})
})
}
export class ResponseResultModel {
/**
* Code returned by the network request: success, fail.
*/
status: number;
/**
* Message returned by the network request.
*/
message: string | Resource;
/**
* Data returned by the network request.
*/
data: string | Object | ArrayBuffer;
constructor() {
this.status = 0;
this.message = '';
this.data = '';
}
}