欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

axios請(qǐng)求響應(yīng)數(shù)據(jù)加解密封裝實(shí)現(xiàn)詳解

 更新時(shí)間:2023年03月13日 09:40:14   作者:forrest醬  
這篇文章主要為大家介紹了axios請(qǐng)求響應(yīng)數(shù)據(jù)加解密封裝實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

安裝依賴

在前端開(kāi)發(fā)中,我們經(jīng)常需要向后端發(fā)送請(qǐng)求獲取數(shù)據(jù)。為了保證數(shù)據(jù)的安全性,在發(fā)送請(qǐng)求時(shí)需要對(duì)請(qǐng)求參數(shù)進(jìn)行加密處理。本文將介紹如何使用Typescript、Axios封裝請(qǐng)求響應(yīng)數(shù)據(jù)加解密。

首先我們需要安裝以下依賴:

  • Axios:用于發(fā)送請(qǐng)求
  • crypto-js:用于加密請(qǐng)求參數(shù)
npm install axios crypto-js
npm install axios

封裝基礎(chǔ)axios

以下是一個(gè)基礎(chǔ)的Axios配置,使用Typescript和Axios進(jìn)行封裝。它包括一個(gè)攔截器,用于在每個(gè)請(qǐng)求中添加一個(gè)通用的請(qǐng)求頭。您可以在這個(gè)基礎(chǔ)上擴(kuò)展您的請(qǐng)求配置。

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;

在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為axiosInstance的Axios實(shí)例,它有一個(gè)通用的請(qǐng)求頭Authorization,值為your-token。您可以根據(jù)自己的需要修改和擴(kuò)展這個(gè)基礎(chǔ)配置。

例如,您可以添加一個(gè)攔截器,用于在每個(gè)請(qǐng)求中添加一個(gè)時(shí)間戳,以確保請(qǐng)求不會(huì)被緩存:

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;
});

除此之外,您還可以在這個(gè)基礎(chǔ)配置中添加錯(cuò)誤處理邏輯、超時(shí)處理邏輯等等,以滿足您的具體需求。

封裝加密方法

單獨(dú)封裝出加密的方法,可以更加方便的調(diào)用,代碼如下:

import CryptoJS from 'crypto-js';
/**
 * 對(duì)數(shù)據(jù)進(jìn)行加密處理
 * @param data 需要加密的數(shù)據(jù)
 * @param key 加密密鑰
 * @returns 加密后的字符串
 */
export const encryptData = (data: any, key: string): string => {
  // 使用CryptoJS庫(kù)的AES加密方法對(duì)數(shù)據(jù)進(jìn)行加密處理
  const ciphertext = CryptoJS.AES.encrypt(
    JSON.stringify(data),
    CryptoJS.enc.Utf8.parse(key),
    {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    }
  );
  // 將加密后的結(jié)果轉(zhuǎn)換為字符串,并返回
  return ciphertext.toString();
}

這個(gè)方法接收兩個(gè)參數(shù):需要加密的數(shù)據(jù)以及加密密鑰。它使用AES算法對(duì)數(shù)據(jù)進(jìn)行加密,并返回加密后的字符串。

封裝解密方法

單獨(dú)封裝出解密的方法,可以更加方便的調(diào)用,代碼如下:

import CryptoJS from 'crypto-js';
/**
 * 解密數(shù)據(jù)
 * @param ciphertext 密文
 * @param key 解密密鑰
 * @returns 解密后的數(shù)據(jù)
 */
export const decryptData = <T>(ciphertext: string, key: string): T => {
  let decryptedData;
  try {
    // 使用CryptoJS庫(kù)的AES解密方法對(duì)數(shù)據(jù)進(jìn)行解密處理
    const decryptedBytes = CryptoJS.AES.decrypt(
      ciphertext,
      CryptoJS.enc.Utf8.parse(key),
      {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
      }
    );
    // 將解密后的結(jié)果轉(zhuǎn)換為字符串,并解析為JSON對(duì)象
    const decryptedString = decryptedBytes.toString(CryptoJS.enc.Utf8);
    decryptedData = JSON.parse(decryptedString);
  } catch (error) {
    // 如果解密失敗,拋出一個(gè)錯(cuò)誤
    throw new Error('Failed to decrypt data: ' + error.message);
  }
  // 返回解密后的數(shù)據(jù)
  return decryptedData as T;
}

decryptData函數(shù)上添加一個(gè)泛型<T>,表示期望的解密后的數(shù)據(jù)的類型。在函數(shù)的返回語(yǔ)句中,將返回值轉(zhuǎn)換為T類型。在使用decryptData函數(shù)時(shí),需要顯式指定期望的返回類型,例如:const decryptedData: MyData = decryptData<MyData>(ciphertext, key);

封裝請(qǐng)求方法

接下來(lái)封裝一個(gè)請(qǐng)求方法,使用Axios發(fā)送請(qǐng)求并在發(fā)送請(qǐng)求之前對(duì)請(qǐng)求參數(shù)進(jìn)行加密處理。解密后臺(tái)返回的數(shù)據(jù)使用了與加密方法相同的密鑰,將返回的密文數(shù)據(jù)存儲(chǔ)在res.data中。然后,使用CryptoJS庫(kù)的AES解密方法將密文數(shù)據(jù)解密為字符串,并將其解析為JSON對(duì)象。代碼如下:

import axios, { AxiosResponse, AxiosError } from 'axios';
import CryptoJS from 'crypto-js';
/**
 * 發(fā)起加密GET請(qǐng)求
 * @param url 請(qǐng)求地址
 * @param params 請(qǐng)求參數(shù)
 * @param key 加密密鑰
 * @returns 返回解密后的JSON對(duì)象
 */
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);
  }
};
/**
 * 發(fā)起加密POST請(qǐng)求
 * @param url 請(qǐng)求地址
 * @param data 請(qǐng)求參數(shù)
 * @param key 加密密鑰
 * @returns 返回解密后的JSON對(duì)象
 */
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是解密后的數(shù)據(jù)類型。在調(diào)用這些方法時(shí)顯式指定解密后的數(shù)據(jù)類型,例如const res = await requestGet<MyData>('<http://example.com/api/data>', params, 'my-secret-key');。

requestGet方法封裝了一個(gè)GET請(qǐng)求,requestPost方法封裝了一個(gè)POST請(qǐng)求。使用了CryptoJS庫(kù)的AES加密和解密方法對(duì)請(qǐng)求參數(shù)和返回?cái)?shù)據(jù)進(jìn)行了處理。在使用這些方法時(shí),您需要提供加密密鑰,并根據(jù)需要傳遞請(qǐng)求參數(shù)。

對(duì)返回的數(shù)據(jù)檢測(cè)是否為空或無(wú)效。如果數(shù)據(jù)為空或無(wú)效,我們將拋出一個(gè)錯(cuò)誤。然后使用AES解密方法對(duì)返回的數(shù)據(jù)進(jìn)行解密。如果解密失敗,將拋出一個(gè)錯(cuò)誤。然后,將解密后的數(shù)據(jù)解析為JSON對(duì)象。如果解析失敗,將拋出一個(gè)錯(cuò)誤。最后,將解密后的JSON對(duì)象返回給調(diào)用方。

使用封裝方法

在React組件中使用我們封裝的請(qǐng)求方法了。代碼如下:

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>
  );
}

上述代碼中,調(diào)用requestPost方法發(fā)送一個(gè)POST請(qǐng)求,請(qǐng)求參數(shù)為{ username: 'user', password: 'pass' }。傳遞的加密密鑰為my-secret-key。在請(qǐng)求成功后,控制臺(tái)將輸出返回的數(shù)據(jù)。對(duì)于這個(gè)加密秘鑰可以統(tǒng)一封裝好,可以不用每次調(diào)用的時(shí)候都去傳參。

結(jié)尾

本文寫了如何在前端開(kāi)發(fā)中,使用Typescript、Axios封裝一個(gè)請(qǐng)求加密方法。

首先,我們安裝了必要的依賴:Axios和crypto-js。然后,我們封裝了一個(gè)基礎(chǔ)的Axios配置,并添加了一個(gè)攔截器,用于在每個(gè)請(qǐng)求中添加一個(gè)通用的請(qǐng)求頭。接下來(lái),我們封裝了加密和解密方法,使用AES算法對(duì)請(qǐng)求參數(shù)和返回?cái)?shù)據(jù)進(jìn)行加密和解密處理。最后,我們封裝了一個(gè)請(qǐng)求方法,該方法使用Axios發(fā)送請(qǐng)求并在發(fā)送請(qǐng)求之前對(duì)請(qǐng)求參數(shù)進(jìn)行加密處理。在請(qǐng)求成功后,使用CryptoJS庫(kù)的AES解密方法將返回的密文數(shù)據(jù)解密為字符串,并將其解析為JSON對(duì)象。

如果您需要在前端開(kāi)發(fā)中發(fā)送請(qǐng)求并保護(hù)數(shù)據(jù)的安全性,可以參考使用本文的方法進(jìn)行加密和解密處理。

以上就是axios請(qǐng)求響應(yīng)數(shù)據(jù)加解密封裝實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于封裝axios請(qǐng)求響應(yīng)數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react18中react-redux狀態(tài)管理的實(shí)現(xiàn)

    react18中react-redux狀態(tài)管理的實(shí)現(xiàn)

    本文主要介紹了react18中react-redux狀態(tài)管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • React報(bào)錯(cuò)Too many re-renders解決

    React報(bào)錯(cuò)Too many re-renders解決

    這篇文章主要為大家介紹了React報(bào)錯(cuò)Too many re-renders解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一文詳解React Redux設(shè)計(jì)思想與工作原理

    一文詳解React Redux設(shè)計(jì)思想與工作原理

    最近看項(xiàng)目中使用了?Redux,?便嘗試了解一波?Redux?的設(shè)計(jì)思想與工作原理,所以本文詳細(xì)的給大家介紹了Redux設(shè)計(jì)思想與工作原理,需要的朋友可以參考下
    2023-09-09
  • React中嵌套組件與被嵌套組件的通信過(guò)程

    React中嵌套組件與被嵌套組件的通信過(guò)程

    這篇文章主要介紹了React中嵌套組件與被嵌套組件的通信過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • React組件間通信的三種方法(簡(jiǎn)單易用)

    React組件間通信的三種方法(簡(jiǎn)單易用)

    React知識(shí)中一個(gè)主要內(nèi)容便是組件之間的通信,以下列舉幾種常用的組件通信方式,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-10-10
  • React的事件處理你了解嗎

    React的事件處理你了解嗎

    這篇文章主要為大家詳細(xì)介紹了React的事件處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • React從react-router路由上做登陸驗(yàn)證控制的方法

    React從react-router路由上做登陸驗(yàn)證控制的方法

    本篇文章主要介紹了React從react-router路由上做登陸驗(yàn)證控制的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • React渲染機(jī)制及相關(guān)優(yōu)化方案

    React渲染機(jī)制及相關(guān)優(yōu)化方案

    這篇文章主要介紹了react中的渲染機(jī)制以及相關(guān)的優(yōu)化方案,內(nèi)容包括react渲染步驟、concurrent機(jī)制以及產(chǎn)生作用的機(jī)會(huì),簡(jiǎn)單模擬實(shí)現(xiàn) concurrent mode,基于作業(yè)調(diào)度優(yōu)先級(jí)的思路進(jìn)行項(xiàng)目?jī)?yōu)化的兩個(gè)hooks,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-07-07
  • React中常見(jiàn)的TypeScript定義實(shí)戰(zhàn)教程

    React中常見(jiàn)的TypeScript定義實(shí)戰(zhàn)教程

    這篇文章主要介紹了React中常見(jiàn)的TypeScript定義實(shí)戰(zhàn),本文介紹了Fiber結(jié)構(gòu),F(xiàn)iber的生成過(guò)程,調(diào)和過(guò)程,以及 render 和 commit 兩大階段,需要的朋友可以參考下
    2022-10-10
  • React手寫簽名組件react-signature實(shí)現(xiàn)簽字demo

    React手寫簽名組件react-signature實(shí)現(xiàn)簽字demo

    這篇文章主要為大家介紹了React手寫簽名組件react-signature實(shí)現(xiàn)簽字demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論