如何在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
相关产品推荐
相关产品推荐

