axios请求响应数据加解密封装实现详解

 更新时间:2023年03月13日 09:40:14   作者:forrest酱  
这篇文章主要为大家介绍了axios请求响应数据加解密封装实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

安装依赖

在前端开发中,我们经常需要向后端发送请求获取数据。为了保证数据的安全性,在发送请求时需要对请求参数进行加密处理。本文将介绍如何使用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 = <T>(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>,表示期望的解密后的数据的类型。在函数的返回语句中,将返回值转换为T类型。在使用decryptData函数时,需要显式指定期望的返回类型,例如:const decryptedData: MyData = decryptData<MyData>(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 <T>(url: string, params: any, key: string): Promise<T> => {
  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 <T>(url: string, data: any, key: string): Promise<T> => {
  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);
  }
};

requestGetrequestPost方法的返回类型定义为Promise<T>,其中T是解密后的数据类型。在调用这些方法时显式指定解密后的数据类型,例如const res = await requestGet<MyData>('<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 (
    <button onClick={handleGetData}>Get Data</button>
  );
}

上述代码中,调用requestPost方法发送一个POST请求,请求参数为{ username: 'user', password: 'pass' }。传递的加密密钥为my-secret-key。在请求成功后,控制台将输出返回的数据。对于这个加密秘钥可以统一封装好,可以不用每次调用的时候都去传参。

结尾

本文写了如何在前端开发中,使用Typescript、Axios封装一个请求加密方法。

首先,我们安装了必要的依赖:Axios和crypto-js。然后,我们封装了一个基础的Axios配置,并添加了一个拦截器,用于在每个请求中添加一个通用的请求头。接下来,我们封装了加密和解密方法,使用AES算法对请求参数和返回数据进行加密和解密处理。最后,我们封装了一个请求方法,该方法使用Axios发送请求并在发送请求之前对请求参数进行加密处理。在请求成功后,使用CryptoJS库的AES解密方法将返回的密文数据解密为字符串,并将其解析为JSON对象。

如果您需要在前端开发中发送请求并保护数据的安全性,可以参考使用本文的方法进行加密和解密处理。

以上就是axios请求响应数据加解密封装实现详解的详细内容,更多关于封装axios请求响应数据的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈React底层实现原理

    浅谈React底层实现原理

    本文主要介绍了浅谈React底层实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • vue3中获取ref元素的几种方式总结

    vue3中获取ref元素的几种方式总结

    这篇文章主要介绍了vue3中获取ref元素的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • react使用axios进行api网络请求的封装方法详解

    react使用axios进行api网络请求的封装方法详解

    这篇文章主要为大家详细介绍了react使用axios进行api网络请求的封装方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 一文详解React Redux设计思想与工作原理

    一文详解React Redux设计思想与工作原理

    最近看项目中使用了 Redux, 便尝试了解一波 Redux 的设计思想与工作原理,所以本文详细的给大家介绍了Redux设计思想与工作原理,需要的朋友可以参考下
    2023-09-09
  • React组件实例三大属性state props refs使用详解

    React组件实例三大属性state props refs使用详解

    这篇文章主要为大家介绍了React组件实例三大属性state props refs使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • React Hooks 实现和由来以及解决的问题详解

    React Hooks 实现和由来以及解决的问题详解

    这篇文章主要介绍了React Hooks 实现和由来以及解决的问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • React更新渲染原理深入分析

    React更新渲染原理深入分析

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你对这些问题还不是很明白,那么可以在这篇文章中找到答案
    2022-12-12
  • React中props使用教程

    React中props使用教程

    props是组件(包括函数组件和class组件)间的内置属性,用其可以传递数据给子节点,props用来传递参数。组件实例化过程中,你可以向其中传递一个参数,这个参数会在实例化过程中被引用
    2022-09-09
  • 在React中强制重新渲染的4 种方式案例代码

    在React中强制重新渲染的4 种方式案例代码

    这篇文章主要介绍了在React中强制重新渲染的4 种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • React18中的useDeferredValue示例详解

    React18中的useDeferredValue示例详解

    这篇文章主要介绍了React18中的useDeferredValue的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论