API网关集成响应映射:从Step Function输出解析statusCode和body



我想使用VTL解析API网关集成响应中的"statusCode"one_answers"body"值,并将它们作为方法响应返回,如下所示:

Request status: 201
Response body: {"firstName":"He","lastName":"Man","email":"he.man@eternia.com"}

我的API网关步骤函数集成返回以下集成响应主体(这是在转换之前,从输出中删除了不相关的属性(:

{
"output": "{"statusCode":201,"body":{"firstName":"He","lastName":"Man","email":"he.man@eternia.com"}}"
}

我认为这是可行的:

#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被更新,但body作为对象表示返回,即不是JSON。

Request status: 201
Response body: {firstName=He, lastName=Man, email=he.man@eternia.com}

在上述情况下,如何将$output.body正确序列化为JSON?API网关似乎不像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":"he.man@eternia.com"}}

相关参考文件:

  • https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartSyncExecution.html#API_StartSyncExecution_ResponseSyntax
  • https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

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

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

希望这能有所帮助!

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

我遇到了同样的问题。这就是我最终解决问题的方法。@noahtk7提供的解决方案非常适合简单的对象,我有我需要的大型嵌套对象。

为了实现这一点,您需要将主体作为base64编码的字符串返回。这在步进函数中很容易做到。E.G:

"Pass": {
"Type": "Pass",
"Next": "Success",
"Parameters": {
"Base64.$": "States.Base64Encode(States.JsonToString($.Response.Body))"
},
"ResultPath": "$.Response.Body"
}

然后在api响应映射器中:

#set($output = $util.parseJson($input.path('$.output')))
#set($context.responseOverride.status = $output.Response.Status)
$util.base64Decode($output.Response.Body.Base64)

会给我一个结果:

{
"foo": "bar",
"Id": "c2b2220c-00e3-4499-87c0-d06ea5e5f1f4"
}

在另一个线程中看到了类似的答案,但现在找不到。

output值是JSON,而不是VTL。对象$的其余部分是VTL。我们还需要将JSON转换为VTL。

#set ($output = $util.parseJson($input.path('$.output')))
#set ($input.path('$').nameitWhateverYouWant = $output)
$input.json('$.nameitWhateverYouWant.body')

所以第一行创建原始output值的VTL表示。然后我们只需要将它插入回$中,这样我们就可以使用$input方法来获得我们需要的内容(见第2行和第3行(。

相关内容

  • 没有找到相关文章

最新更新