API Gateway VTL模板对接EventBridge:字符转义问题求助
解决方案:API Gateway VTL模板优雅生成EventBridge PutEvents请求
核心思路是先构建Detail中Data的完整JSON结构,再将其整体转义为符合EventBridge要求的字符串,彻底避免手动转义的繁琐操作。
完整可运行的VTL模板
#set($context.requestOverride.header.X-Amz-Target = "AWSEvents.PutEvents") #set($context.requestOverride.header.Content-Type = "application/x-amz-json-1.1") #set($allParams = $input.params()) #set($dataJson = { "body-json": $input.json('$'), "params": { #foreach($type in $allParams.keySet()) #set($params = $allParams.get($type)) "$type": { #foreach($paramName in $params.keySet()) "$paramName": "$util.escapeJavaScript($params.get($paramName))" #if($foreach.hasNext),#end #end } #if($foreach.hasNext),#end #end }, "stage-variables": { #foreach($key in $stageVariables.keySet()) "$key": "$util.escapeJavaScript($stageVariables.get($key))" #if($foreach.hasNext),#end #end }, "context": { "account-id": "$context.identity.accountId", "api-id": "$context.apiId", "api-key": "$context.identity.apiKey", "authorizer-principal-id": "$context.authorizer.principalId", "caller": "$context.identity.caller", "cognito-authentication-provider": "$context.identity.cognitoAuthenticationProvider", "cognito-authentication-type": "$context.identity.cognitoAuthenticationType", "cognito-identity-id": "$context.identity.cognitoIdentityId", "cognito-identity-pool-id": "$context.identity.cognitoIdentityPoolId", "http-method": "$context.httpMethod", "stage": "$context.stage", "source-ip": "$context.identity.sourceIp", "user": "$context.identity.user", "user-agent": "$context.identity.userAgent", "user-arn": "$context.identity.userArn", "request-id": "$context.requestId", "resource-id": "$context.resourceId", "resource-path": "$context.resourcePath" } }) { "Entries": [ { "Detail": "$util.escapeJavaScript($dataJson)", "DetailType": "FILL-NAME", "EventBusName": "$stageVariables.eventBus", "Source": "ClientRequest", "MetaData": {} } ] }
关键说明
- 先构建完整Data结构:用
#set($dataJson = {...})将请求体、参数、环境变量、上下文数据组织成标准JSON对象,仅对单个参数/变量值做$util.escapeJavaScript处理,避免特殊字符干扰。 - 整体转义为字符串:将完整的
$dataJson传入$util.escapeJavaScript,生成符合EventBridge要求的转义字符串,直接赋值给Detail字段(注意这里Detail的值是带引号的字符串类型)。 - 保持模板可读性:模板结构分层清晰,foreach循环正常执行,无需手动转义JSON结构字符,后续维护成本极低。
原模板失效原因
EventBridge的PutEvents接口要求Detail字段是JSON格式的字符串,而非嵌套的JSON对象。之前的模板直接将Detail设为JSON对象,导致格式不符合API规范;手动转义又破坏了模板的可读性。通过先构建完整JSON再整体转义的方式,完美解决了格式合规性与可读性的矛盾。
内容的提问来源于stack exchange,提问作者Omri Goldberger
相关产品推荐
相关产品推荐

