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

如何为带请求体的API Gateway Lambda代理POST方法启用缓存?

API Gateway POST代理方法请求体缓存解决方案

问题本质

API Gateway的阶段缓存默认仅基于请求路径、查询参数、指定HTTP头部生成缓存键,不会自动将POST请求体纳入缓存键逻辑。所以即便你启用了方法缓存,只要请求体以外的缓存键要素不变,就会返回旧缓存结果,且控制台确实没有直接的"请求体缓存"开关,必须通过自定义缓存键逻辑实现。

可行解决方案

方案1:Lambda函数生成请求体哈希作为缓存键的一部分

这是Lambda代理集成下最直接的实现方式,通过在Lambda中对请求体生成唯一标识,将其作为自定义头部返回,再让API Gateway把这个头部纳入缓存键:

  1. 修改Lambda函数,对请求体生成哈希值并加入响应头部:
import hashlib
import json

def lambda_handler(event, context):
    request_body = event.get('body', '')
    # 生成请求体的MD5哈希值,用于区分不同请求体
    body_hash = hashlib.md5(request_body.encode('utf-8')).hexdigest()
    
    return {
        'statusCode': 200,
        'headers': {
            'X-Request-Body-Hash': body_hash,
            'Content-Type': 'application/json'
        },
        'body': json.dumps({'your_result': 'data_here'})
    }
  1. 配置API Gateway缓存键:
  • 进入目标POST方法的方法执行页面,打开缓存设置
  • 在「缓存键设置」区域,点击「添加头部」,输入X-Request-Body-Hash,勾选「包含在缓存键中」
  • 保存配置并重新部署API到对应阶段

方案2:API Gateway映射模板注入请求体标识(适合不想修改Lambda的场景)

通过API Gateway的VTL映射模板,将请求体的编码值或哈希值注入自定义头部,再纳入缓存键(Lambda代理集成下需确认映射模板生效):

  1. 进入POST方法的集成请求,展开「映射模板」
  2. 选择对应请求内容类型(如application/json),创建映射模板:
#set($rawBody = $input.body)
#set($encodedBody = $util.base64Encode($rawBody))
$context.requestOverride.header.X-Request-Body-Encoded = $encodedBody
  1. 进入方法的缓存设置,将X-Request-Body-Encoded头部添加到缓存键包含列表
  2. 保存并重新部署API

注意事项

  • 缓存容量:如果请求体变化频繁,会生成大量缓存条目,需注意阶段缓存的容量限制,避免缓存溢出导致频繁失效
  • 哈希可靠性:使用MD5足够用于缓存键区分,无需加密级哈希;若请求体过大,可选择提取关键参数生成哈希,减少计算开销
  • 头部验证:配置完成后,可通过测试工具查看响应头部是否包含自定义的哈希/编码头部,确认缓存键逻辑生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:15:31