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

如何在AWS API Gateway集成SQS时将自定义Header映射到请求Body?

问题分析与解决方案

原代码的错误点

  • 请求头获取方式错误:原代码中$input.params().header.get("X-Project-Id")写法不符合API Gateway VTL规范,正确的请求头读取方式应为$input.params('X-Project-Id')或$input.headers().get('X-Project-Id'),原写法会导致无法正确解析头信息。
  • JSON拼接格式错误:直接将$input.body嵌入字符串会破坏JSON结构——如果请求body本身包含双引号、换行等特殊字符,会直接导致外层JSON语法失效,且未做任何转义处理。
  • 空值处理缺失:当X-Project-Id头不存在时,$headerValue会为null,直接拼接会生成"ProjectId": "null"这类无效JSON,触发请求转换失败。

正确的VTL实现

#set($projectId = $input.params('X-Project-Id'))
#set($escapedBody = $util.escapeJavaScript($input.body))
#set($messagePayload = "{ \"body\": $escapedBody, \"ProjectId\": \"$projectId\" }")
Action=SendMessage&MessageBody=$util.urlEncode($messagePayload)

代码说明

  1. 标准请求头读取:使用$input.params('X-Project-Id')直接获取指定请求头,这是API Gateway VTL中读取请求头的标准写法。
  2. 请求体转义处理:通过$util.escapeJavaScript($input.body)对请求体中的特殊字符(双引号、换行、反斜杠等)进行转义,确保嵌入外层JSON时不会破坏格式。
  3. 合法JSON构造:将转义后的body和ProjectId拼接为合法JSON字符串,即使ProjectId为空,也会生成"ProjectId": ""的有效结构。
  4. URL编码适配SQS:使用$util.urlEncode()对整个消息体编码,符合SQS SendMessage接口要求的application/x-www-form-urlencoded格式。

可选空值优化(按需使用)

如果需要在X-Project-Id不存在时不包含该字段,或设置默认值,可添加条件判断:

#set($projectId = $input.params('X-Project-Id'))
#set($escapedBody = $util.escapeJavaScript($input.body))
#set($messagePayload = "{ \"body\": $escapedBody" )
#if($projectId != "")
    #set($messagePayload = $messagePayload + ", \"ProjectId\": \"$projectId\"" )
#end
#set($messagePayload = $messagePayload + " }")
Action=SendMessage&MessageBody=$util.urlEncode($messagePayload)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:35:10