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

API Gateway集成Step Function时VTL映射模板无法正确返回指定状态码与JSON响应体的问题求助

API Gateway集成Step Function时VTL映射模板无法正确返回指定状态码与JSON响应体的问题求助

我最近在处理API Gateway和Step Function的集成响应映射,快被VTL搞疯了(真的没夸张,为这么个本该简单的问题耗了3小时),想请教各位有没有解决办法!

情况是这样的:我的Step Function会输出类似这样的JSON:

{ "statusCode": 400, "body": { "error": "Email already associated with another account" } }

我希望通过API Gateway返回给客户端的是400状态码,同时响应体是:

{"error": "Email already associated with another account"}

但试了好几个VTL模板都没成功,下面是我的尝试过程:

  • 最开始的模板,能完整返回Step Function的输出,但没法修改状态码:
#set ($parsedPayload = $util.parseJson($input.json('$.output')))
$parsedPayload

结果:返回了完整的Step Function输出,但状态码还是默认的200,不符合要求。

  • 尝试修改响应状态码,结果完全没生效:
#set ($parsedPayload = $util.parseJson($input.json('$.output')))
#set($context.responseOverride.status = $parsedPayload.statusCode)
$parsedPayload

结果:依然返回200状态码,响应体和之前一样,状态码的修改完全没起作用。

  • 尝试只返回body部分,结果更糟:
#set($parsedPayload = $util.parseJson($input.json('$.output')))
#set($context.responseOverride.status = $parsedPayload.statusCode) // 还是没变化 :)
#set($grabBody = $parsedPayload.body)
$grabBody

结果:状态码还是200,而且响应体直接为空了,完全搞不懂。

  • 后来终于让状态码生效了,但响应体格式出问题:
#set($outputJson = $util.parseJson($input.body))
#set($stepFunctionOutput = $util.parseJson($outputJson.output))
#set($context.responseOverride.status = $stepFunctionOutput.statusCode)
$stepFunctionOutput.body

结果:状态码终于正确变成400了,但响应体变成了{error=Email already associated with another account}——这格式根本没法解析啊!而且我没法保证每次都只有error字段,总不能为了这个维护一堆模板适配不同的响应结构吧?

有没有大佬知道怎么解决这个问题?既能正确设置响应状态码,又能把body部分以标准JSON格式返回给客户端?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:53:08