You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Axios Cache Interceptor对POST请求启用缓存?

让Axios Cache Interceptor支持POST请求缓存的解决方案

Axios Cache Interceptor默认仅对GET请求启用缓存,要让POST请求也能触发缓存,需要调整两个核心配置:允许缓存POST方法,以及确保缓存键包含请求体(因为POST请求的参数通常在body中,相同URL不同body应对应不同缓存)。

1. 全局配置(推荐)

在初始化缓存拦截器时,通过methods选项添加POST,并自定义keyGenerator来包含请求体信息:

import axios from 'axios';
import { setupCache } from 'axios-cache-interceptor';

// 创建axios实例
const axiosInstance = axios.create();

// 配置缓存拦截器
const cachedAxios = setupCache(axiosInstance, {
  // 允许缓存GET和POST请求
  methods: ['get', 'post'],
  // 自定义缓存键:方法+URL+请求体,确保相同请求(方法、URL、body一致)命中同一缓存
  keyGenerator: (request) => {
    // 处理不同类型的请求体
    let dataKey = '';
    if (request.data instanceof FormData) {
      // 处理FormData:转换为有序的键值对字符串,避免顺序不同导致缓存键不一致
      const sortedEntries = Array.from(request.data.entries()).sort((a, b) => a[0].localeCompare(b[0]));
      dataKey = JSON.stringify(sortedEntries);
    } else {
      // 普通JSON数据直接序列化
      dataKey = JSON.stringify(request.data);
    }
    return `${request.method.toLowerCase()}-${request.url}-${dataKey}`;
  },
  // 设置缓存有效期(示例:5分钟)
  ttl: 5 * 60 * 1000
});

之后使用cachedAxios.post发起请求,就能自动缓存符合条件的POST请求:

const req1 = await cachedAxios.post('/api-1', body);
const req2 = await cachedAxios.post('/api-1', body); // 命中缓存,req2.cached为true

2. 单个请求单独配置

如果不需要全局启用POST缓存,可在单个POST请求中单独开启缓存,并指定包含请求体的缓存键:

// 假设已经初始化了基础的cachedAxios实例
const req = await cachedAxios.post('/api-1', body, {
  cache: {
    // 启用当前请求的缓存
    enabled: true,
    // 自定义缓存键,确保包含请求体
    key: `post-/api-1-${JSON.stringify(body)}`
  }
});

注意事项

  • 仅对幂等的POST请求使用缓存:即多次执行相同POST请求不会改变服务器状态(比如用于复杂查询的POST,而非提交表单、修改数据的POST),否则会导致数据不一致。
  • 若请求体包含无法被JSON.stringify序列化的内容(如Blob),需要自定义序列化逻辑,比如生成哈希值来唯一标识请求体。

内容的提问来源于stack exchange,提问作者Zhijie Weng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:00:47