封装axios中请求响应数据加解密

39 篇文章 0 订阅

在前端开发中,我们经常需要向后端发送请求获取数据。为了保证数据的安全性,在发送请求时需要对请求参数进行加密处理。本文将介绍如何使用Typescript、Axios封装请求响应数据加解密。
安装依赖
首先我们需要安装以下依赖:
Axios:用于发送请求
crypto-js:用于加密请求参数

npm install axios crypto-js
npm install axios

封装基础axios
以下是一个基础的Axios配置,使用Typescript和Axios进行封装。它包括一个拦截器,用于在每个请求中添加一个通用的请求头。您可以在这个基础上扩展您的请求配置。
import axios, { AxiosInstance, AxiosRequestConfig } from ‘axios’;

const axiosInstance: AxiosInstance = axios.create({
baseURL: ‘http://example.com/api’,
timeout: 10000,
withCredentials: true, // 允许携带cookie
});

axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
config.headers.common[‘Authorization’] = ‘your-token’;

return config;
});

export default axiosInstance;

在这个示例中,我们创建了一个名为axiosInstance的Axios实例,它有一个通用的请求头Authorization,值为your-token。您可以根据自己的需要修改和扩展这个基础配置。
例如,您可以添加一个拦截器,用于在每个请求中添加一个时间戳,以确保请求不会被缓存:
axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
config.headers.common[‘Authorization’] = ‘your-token’;
config.headers.common[‘Cache-Control’] = ‘no-cache’;
config.headers.common[‘Pragma’] = ‘no-cache’;
config.headers.common[‘Expires’] = ‘0’;
config.params = {
…config.params,
timestamp: new Date().getTime(),
};

return config;
});

除此之外,您还可以在这个基础配置中添加错误处理逻辑、超时处理逻辑等等,以满足您的具体需求。
封装加密方法
单独封装出加密的方法,可以更加方便的调用,代码如下:
import CryptoJS from ‘crypto-js’;

/**

  • 对数据进行加密处理
  • @param data 需要加密的数据
  • @param key 加密密钥
  • @returns 加密后的字符串
    */
    export const encryptData = (data: any, key: string): string => {
    // 使用CryptoJS库的AES加密方法对数据进行加密处理
    const ciphertext = CryptoJS.AES.encrypt(
    JSON.stringify(data),
    CryptoJS.enc.Utf8.parse(key),
    {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
    }
    );

// 将加密后的结果转换为字符串,并返回
return ciphertext.toString();
}

这个方法接收两个参数:需要加密的数据以及加密密钥。它使用AES算法对数据进行加密,并返回加密后的字符串。
封装解密方法
单独封装出解密的方法,可以更加方便的调用,代码如下:
import CryptoJS from ‘crypto-js’;

/**

  • 解密数据

  • @param ciphertext 密文

  • @param key 解密密钥

  • @returns 解密后的数据
    */
    export const decryptData = (ciphertext: string, key: string): T => {
    let decryptedData;
    try {
    // 使用CryptoJS库的AES解密方法对数据进行解密处理
    const decryptedBytes = CryptoJS.AES.decrypt(
    ciphertext,
    CryptoJS.enc.Utf8.parse(key),
    {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
    }
    );

    // 将解密后的结果转换为字符串,并解析为JSON对象
    const decryptedString = decryptedBytes.toString(CryptoJS.enc.Utf8);
    decryptedData = JSON.parse(decryptedString);
    } catch (error) {
    // 如果解密失败,抛出一个错误
    throw new Error('Failed to decrypt data: ’ + error.message);
    }

// 返回解密后的数据
return decryptedData as T;
}

在decryptData函数上添加一个泛型,表示期望的解密后的数据的类型。在函数的返回语句中,将返回值转换为T类型。在使用decryptData函数时,需要显式指定期望的返回类型,例如:const decryptedData: MyData = decryptData(ciphertext, key);。
封装请求方法
接下来封装一个请求方法,使用Axios发送请求并在发送请求之前对请求参数进行加密处理。解密后台返回的数据使用了与加密方法相同的密钥,将返回的密文数据存储在res.data中。然后,使用CryptoJS库的AES解密方法将密文数据解密为字符串,并将其解析为JSON对象。代码如下:
import axios, { AxiosResponse, AxiosError } from ‘axios’;
import CryptoJS from ‘crypto-js’;

/**

  • 发起加密GET请求
  • @param url 请求地址
  • @param params 请求参数
  • @param key 加密密钥
  • @returns 返回解密后的JSON对象
    */
    export const requestGet = async (url: string, params: any, key: string): Promise => {
    const encryptedParams = encryptData(params, key);

try {
const res = await axios.get(url, {
params: {
data: encryptedParams,
},
});

if (!res.data) {
  throw new Error('Response data is empty.');
}

return decryptData<T>(res.data, key);

} catch (error) {
throw new Error('Failed to send request: ’ + error.message);
}
};

/**

  • 发起加密POST请求
  • @param url 请求地址
  • @param data 请求参数
  • @param key 加密密钥
  • @returns 返回解密后的JSON对象
    */
    export const requestPost = async (url: string, data: any, key: string): Promise => {
    const encryptedData = encryptData(data, key);

try {
const res = await axios.post(url, {
data: encryptedData,
});

if (!res.data) {
  throw new Error('Response data is empty.');
}

return decryptData<T>(res.data, key);

} catch (error) {
throw new Error('Failed to send request: ’ + error.message);
}
};

将requestGet和requestPost方法的返回类型定义为Promise,其中T是解密后的数据类型。在调用这些方法时显式指定解密后的数据类型,例如const res = await requestGet(‘http://example.com/api/data’, params, ‘my-secret-key’);。
requestGet方法封装了一个GET请求,requestPost方法封装了一个POST请求。使用了CryptoJS库的AES加密和解密方法对请求参数和返回数据进行了处理。在使用这些方法时,您需要提供加密密钥,并根据需要传递请求参数。
对返回的数据检测是否为空或无效。如果数据为空或无效,我们将抛出一个错误。然后使用AES解密方法对返回的数据进行解密。如果解密失败,将抛出一个错误。然后,将解密后的数据解析为JSON对象。如果解析失败,将抛出一个错误。最后,将解密后的JSON对象返回给调用方。
使用封装方法
在React组件中使用我们封装的请求方法了。代码如下:
import { request } from ‘./request’;

const App = () => {
const handleGetData = async () => {
try {
const res = await requestPost(‘http://example.com/api/data’, {
username: ‘user’,
password: ‘pass’,
}, ‘my-secret-key’);

  console.log(res.data);
} catch (error) {
  console.error(error);
}

};

return (
Get Data
);
}

上述代码中,调用requestPost方法发送一个POST请求,请求参数为{ username: ‘user’, password: ‘pass’ }。传递的加密密钥为my-secret-key。在请求成功后,控制台将输出返回的数据。对于这个加密秘钥可以统一封装好,可以不用每次调用的时候都去传参。
结尾
本文写了如何在前端开发中,使用Typescript、Axios封装一个请求加密方法。首先,我们安装了必要的依赖:Axios和crypto-js。然后,我们封装了一个基础的Axios配置,并添加了一个拦截器,用于在每个请求中添加一个通用的请求头。接下来,我们封装了加密和解密方法,使用AES算法对请求参数和返回数据进行加密和解密处理。最后,我们封装了一个请求方法,该方法使用Axios发送请求并在发送请求之前对请求参数进行加密处理。在请求成功后,使用CryptoJS库的AES解密方法将返回的密文数据解密为字符串,并将其解析为JSON对象。
如果您需要在前端开发中发送请求并保护数据的安全性,可以参考使用本文的方法进行加密和解密处理。如有错误或更好的建议,欢迎评论区一起交流哈。

Promise封装axios数据请求是一种常见的前端开发技术,它可以帮助我们更好地处理异步请求,提高代码的可读性和可维护性。具体实现方式可以参考以下步骤: 1. 创建一个axios实例,并设置一些默认配置,如请求超时时间、请求头等。 2. 将axios实例封装成一个Promise对象,通过resolve和reject方法来处理请求成功和失败的情况。 3. 在封装的Promise对象,通过axios的get、post等方法来发送请求,并将请求结果通过resolve方法返回。 4. 在调用Promise对象时,可以通过then方法来处理请求成功的情况,通过catch方法来处理请求失败的情况。 例如,下面是一个简单的Promise封装axios数据请求的示例代码: ``` import axios from 'axios' const instance = axios.create({ timeout: 500, headers: { 'Content-Type': 'application/json' } }) export const get = (url, params) => { return new Promise((resolve, reject) => { instance.get(url, { params }) .then(res => { resolve(res.data) }) .catch(err => { reject(err) }) }) } export const post = (url, data) => { return new Promise((resolve, reject) => { instance.post(url, data) .then(res => { resolve(res.data) }) .catch(err => { reject(err) }) }) } ``` 在上面的代码,我们通过创建一个axios实例instance,并设置了默认的请求超时时间和请求头。然后,我们分别封装了get和post方法,并在方法使用axios的get和post方法来发送请求,并通过resolve和reject方法来处理请求成功和失败的情况。最后,我们将封装好的方法通过export导出,以便在其他地方使用。 使用时,我们可以通过以下方式来调用封装好的方法: ``` import { get, post } from './api' get('/api/user', { id: 1 }) .then(res => { console.log(res) }) .catch(err => { console.log(err) }) post('/api/login', { username: 'admin', password: '123456' }) .then(res => { console.log(res) }) .catch(err => { console.log(err) }) ``` 在上面的代码,我们分别调用了get和post方法,并通过then和catch方法来处理请求成功和失败的情况。通过这种方式,我们可以更好地处理异步请求,提高代码的可读性和可维护性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieChan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值