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

如何在CDK中从StepFunctions提取嵌套对象作为API Gateway响应

问题:从Step Functions输出提取嵌套对象作为API Gateway响应体

我尝试从Step Functions状态机的输出中提取一个嵌套对象,作为API Gateway响应的返回体。状态机的原始输出如下,但到达API Gateway时会变成转义字符串(所以我调用了$util.parseJson(...)):

{
  "statusCode": 200,
  "prop2": {
             "message": "Hello"
           }
}

我希望返回的响应体是prop2,格式如下:

{
  "message": "Hello"
}

我的API Gateway与状态机的集成配置(TypeScript CDK)如下:

// 上下文信息(仅供参考)
const api = new RestApi(...);
const apiResource= api.root.addResource("sample");

// 核心配置
apiResource.addMethod("POST", StepFunctionsIntegration.startExecution(createData, {
      integrationResponses: [
        {
          selectionPattern: "200",
          statusCode: "200",
          responseTemplates: {
            "application/json": [
              "#set($response = $util.parseJson($input.json(\"$.output\")))",
              "$response.prop2",
            ].join("\n"),
          }
        }
      ]
}));

但当前配置返回的响应体为空,尝试用$response[\"prop2\"]又触发了内部服务器错误。注意单独使用$response时,能正常返回状态机的完整JSON输出。想知道这种需求是否可行,还是API Gateway的VTL有什么限制?

解决方案

这种需求完全可行,问题出在VTL模板的写法上。当你直接输出$response.prop2时,API Gateway的VTL不会自动将这个对象序列化为JSON字符串,导致返回空内容。你需要用$util.toJson()方法把嵌套对象转换成JSON格式:

修改responseTemplates里的模板内容:

"application/json": [
  "#set($response = $util.parseJson($input.json(\"$.output\")))",
  "$util.toJson($response.prop2)",
].join("\n"),

这样就能正确返回prop2对应的JSON对象了。

另外,你之前尝试的$response[\"prop2\"]写法在VTL里是错误的,VTL访问对象属性应该用.或者$response.get('prop2'),方括号的写法不符合VTL语法,这就是触发内部服务器错误的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:52:13