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

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": {}
    }
  ]
}

关键说明

  1. 先构建完整Data结构:用#set($dataJson = {...})将请求体、参数、环境变量、上下文数据组织成标准JSON对象,仅对单个参数/变量值做$util.escapeJavaScript处理,避免特殊字符干扰。
  2. 整体转义为字符串:将完整的$dataJson传入$util.escapeJavaScript,生成符合EventBridge要求的转义字符串,直接赋值给Detail字段(注意这里Detail的值是带引号的字符串类型)。
  3. 保持模板可读性:模板结构分层清晰,foreach循环正常执行,无需手动转义JSON结构字符,后续维护成本极低。

原模板失效原因

EventBridge的PutEvents接口要求Detail字段是JSON格式的字符串,而非嵌套的JSON对象。之前的模板直接将Detail设为JSON对象,导致格式不符合API规范;手动转义又破坏了模板的可读性。通过先构建完整JSON再整体转义的方式,完美解决了格式合规性与可读性的矛盾。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:35:29