gpt4 book ai didi

amazon-web-services - 如何在AWS API Gateway映射模板中设置对象键值

转载 作者:行者123 更新时间:2023-12-05 00:49:03 27 4
gpt4 key购买 nike

最近,我熟悉了AWS最特殊的API网关映射模板语法,这对我来说并没有多大意义。

我试图阅读文档,至少要说https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#util-template-reference有点令人费解

我想做的很简单。我在JSON中有一个请求正文,我想向其中添加其他字段timeReceived(以$context.requestTime作为其值)。我幼稚的第一次尝试是#set( $bodyObj.timeReceived = $context.requestTime ),它不起作用。

我很肯定我将使其正常工作,但是要做这样简单的事情将花费很多时间和精力,而IMO是愚蠢的,AWS应该改进现有文档。

编辑:我在下面编写的解决方案有效,但是我主张重新考虑使用API​​网关。我最近更新了我的应用程序,以使用Edge Lambda和CloudFront代替,这在各个方面都是一个更好的解决方案。 lambda无法使用环境变量进行了一些棘手的配置,因此将DeliveryStreamName自动化为代码有点麻烦(我最终在Sceptre中使用了自定义解析器)。但是仍然好很多。不需要这些愚蠢的技巧=)。

最佳答案

编辑:在编写此内容时,我发现1#并没有令人尴尬地部署我的更改,而2#却奏效了。现在,我只需要使用添加的字段将JSON字符串化即可。

10分钟后:嗯,这很难……所以我发现这很有效:

#set($payload = $util.parseJson($input.json('$')))
#set($body = "{
#foreach ($mapEntry in $payload.entrySet())
""$mapEntry.key"": ""$mapEntry.value"",
#end
""timeReceived"": ""$context.requestTime"",
""x-client-ip"": ""$context.identity.sourceIp""
}")

但是将JSON扩展到多行(将JSON发送到Firehose,然后将其存储到S3)是不好的。

20分钟后:当我告诉他我在做什么时,我的高级开发人员 mock 了我,并用几个专家评论了API Gateway Mapping Templates。

40分钟后:我知道该怎么做:用空字符串替换所有换行符,但是事实证明这比我想象的要难。另外,我发现对象内部的嵌套值未进行字符串化。

50分钟后:实际上,我可以通过将整个foreach循环放在单行中来省略换行符。但是我又不得不以某种方式对嵌套值进行字符串化。并将 requestTime格式化为某种愚蠢的英语格式(不冒犯!:))

70分钟后:正确格式化嵌套值确实很困难。我发现了另一个有效的示例:
#set($body =  "{
#foreach ($mapEntry in $payload.entrySet())
#if ($mapEntry.value.size() > 0)
""$mapEntry.key"": {
#foreach($subEntry in $mapEntry.value.entrySet())
""$subEntry.key"": ""$subEntry.value""#if($foreach.hasNext),#end
#end
},
#else
""$mapEntry.key"": ""$mapEntry.value"",
#end
#end
""timeReceived"": $context.requestTimeEpoch}
}")

如果您不希望在其中添加换行符或多余的空格,则表示为:
#set($body = "{#foreach ($mapEntry in $payload.entrySet())#if($mapEntry.value.size() > 0)""$mapEntry.key"": { #foreach($subEntry in $mapEntry.value.entrySet())""$subEntry.key"": ""$subEntry.value""#if($foreach.hasNext), #end#end }, #else""$mapEntry.key"": ""$mapEntry.value"", #end#end""timeReceived"": $context.requestTimeEpoch }" )

在调试和编写此上花了120分钟:嗯,那是一段旅程。我想我已经回答了我自己的问题,所以希望现在有人可以像我一样避免花太多时间调试它。

130分钟后的 : Aaand现在,我必须解决将字符串添加到CloudFormation模板中的悲剧。好家伙。 (这甚至还不是很困难,最困难的部分是重新部署API网关,在编写此文件时,我必须从控制台手动进行此操作)

关于amazon-web-services - 如何在AWS API Gateway映射模板中设置对象键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48339652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com