如何在 API 网关中为请求/响应映射添加速度模板中生成随机 UUID 等功能

Posted

技术标签:

【中文标题】如何在 API 网关中为请求/响应映射添加速度模板中生成随机 UUID 等功能【英文标题】:How to add functions like generating random UUID in velocity template for request/response mapping in API gateway 【发布时间】:2019-08-01 08:32:17 【问题描述】:

我正在为 AWS API 网关创建一个请求映射模板。在该模板中,我想根据某些条件自定义请求参数并应用运算符。

 #foreach($header in $input.params().header.keySet())
     #if($header=="id")#set($idVal = 
     $util.escapejavascript($input.params().header.get($header)))
         #if($idVal.matches("^[0-9a-f]4-[0-9A-Z]3$"))
             "$header":"$idVal"
         #else
           #set($random = UUID.randomUUID())
          "$header":"$random"
         #end
     #else

例如上面的模板中基于if条件我想生成randomUUID并添加到header中。但是当我测试时, id 值设置为空字符串。

如何在velocity模板映射api网关中使用包和java函数支持?另外,请分享对格式良好的模板的任何参考,这对了解更多信息非常有用。

【问题讨论】:

【参考方案1】:

API Gateway 中使用的 VTL 不能使用您自己的包进行扩展。只能使用built-in variables and $util functions。

您可能会发现$context.requestId 包含一个适合您用途的 UUID,对于每个请求都是唯一的。请注意,如果您使用的是 Lambda 集成,则此值与 Lambda 的 context.requestId 不同,后者只是巧合地具有相同的名称。

或者,$context.xrayTraceId 最右边的 33 个字符应该包含一个 4 字节时间戳(8 个十六进制数字)+“-”+一个 96 位唯一值(24 个十六进制数字),您可以从中构造一个可用的 UUID,其中包含一些灯串操作。

【讨论】:

$context.requestId 是 AWS 博客中提到的哈希键:aws.amazon.com/blogs/compute/…【参考方案2】:

你不能使用包,但你可以使用$util helpers

例如,您可以使用$util.autoId() 来生成您的 UUID。

【讨论】:

以上是关于如何在 API 网关中为请求/响应映射添加速度模板中生成随机 UUID 等功能的主要内容,如果未能解决你的问题,请参考以下文章

向 VTL 中的对象添加键/值对(用于 API 网关)

如何从动态列表中为 Vue 中的 API 响应创建列表渲染 JSON?

AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?

在Lambda函数中查找请求的URL

如何将标头从请求传递到集成响应?

在 Cloudformation 模板中为 API 网关启用 CORS DEFAULT 4XX/5XX