amazon-web-services - API网关集成响应映射: parse statusCode and body from Step Function output

标签 amazon-web-services aws-step-functions api-gateway vtl

我想使用 VTL 解析 API Gateway 集成响应中的“statusCode”和“body”值,并将这些值作为方法响应返回,如下所示:

Request status: 201
Response body: {"firstName":"He","lastName":"Man","email":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1d9d49fdcd0dff1d4c5d4c3dfd8d09fd2dedc" rel="noreferrer noopener nofollow">[email protected]</a>"}

我的 API Gateway Step Function 集成返回以下集成响应正文(这是在转换之前,从输出中删除不相关的属性):

{
  "output": "{\"statusCode\":201,\"body\":{\"firstName\":\"He\",\"lastName\":\"Man\",\"email\":\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7d151853101c133d1809180f13141c531e1210" rel="noreferrer noopener nofollow">[email protected]</a>\"}}"
}

我认为这是可行的:

#set ($output = $util.parseJson($input.json('$.output')))
#set ($statusCode = $output.statusCode)
#set ($context.responseOverride.status = $statusCode)
$output.body

但状态未更新且正文为空

Request status: 200
Response body: <empty>

通过这种方法我可以解析正文:

#set ($bodyObj = $util.parseJson($input.body))
#set ($output = $util.parseJson($bodyObj.output))
#set ($context.responseOverride.status = $output.statusCode)
$output.body

statusCode 已更新,但正文以对象表示形式返回,即不是 JSON。

Request status: 201
Response body: {firstName=He, lastName=Man, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4f2a222e262372272a61222e210f2a3b2a3d21262e612c2022" rel="noreferrer noopener nofollow">[email protected]</a>}

在上述情况下如何将 $output.body 正确序列化为 JSON? API Gateway 似乎没有像 AppSync 那样的 $util.toJson 函数 ( https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html )

我已经确认解析输出变量工作正常:

#set ($output = $util.parseJson($input.json('$.output')))
$output
Request status: 200
Response body: {"statusCode":201,"body":{"firstName":"He","lastName":"Man","email":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2cac78ccfc3cce2c7d6c7d0cccbc38cc1cdcf" rel="noreferrer noopener nofollow">[email protected]</a>"}}

相关引用文档:

最佳答案

我遇到了这个问题。确实似乎没有办法直接转换为JSON,所以我设计了一种使用Apache VTL将JSON写入API网关响应的方法:

#set ($outputObj = $util.parseJson($input.path('$.output')))
#foreach ( $key in $outputObj.body.keySet() )
  "$key": $outputObj.body[$key] #if ($foreach.hasNext),#end
#end

希望这有帮助!

(这适用于您所描述的简单用例,但不能推广到嵌套对象等)

关于amazon-web-services - API网关集成响应映射: parse statusCode and body from Step Function output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73463205/

相关文章:

amazon-web-services - 在 AWS CDK 中设置状态机时,如何删除 Lambda 调用的默认重试策略?

microservices - Zuul - 单点故障

amazon-web-services - 如何在 AWS API Gateway 中生成 Set-Cookie 集成响应 header ?

csv - 亚马逊雅典娜 : Dateparse shows Invalid Format

linux - 在哪里可以找到适用于 EC2 上的 Hadoop 的 AMI?

amazon-web-services - 如何进行 AWS S3 SSE KMS key 轮换?

amazon-web-services - AWS CloudFormation 是否支持 ECS 任务放置策略?

amazon-web-services - 如果并行状态中的某个状态失败,如何继续执行 aws 中的步骤函数?

java - 如何在 AWS Lambda 函数中获取任务 token

amazon-web-services - AWS API Gateway 访问私有(private)子网