如何在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)
代码说明
- 标准请求头读取:使用
$input.params('X-Project-Id')直接获取指定请求头,这是API Gateway VTL中读取请求头的标准写法。 - 请求体转义处理:通过
$util.escapeJavaScript($input.body)对请求体中的特殊字符(双引号、换行、反斜杠等)进行转义,确保嵌入外层JSON时不会破坏格式。 - 合法JSON构造:将转义后的body和ProjectId拼接为合法JSON字符串,即使ProjectId为空,也会生成
"ProjectId": ""的有效结构。 - 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
相关产品推荐
相关产品推荐

