如何在 AWS appSync 中操作 Apache Velocity 请求映射模板中的字符串和数组
How to manipulate strings and array in Apache Velocity request mapping template in AWS appSync
这是我第一次使用 VTL,所以如果其中有非常愚蠢的地方,请更正我的代码。
我想达到的目标
{
"cities": ["jaipur", "mumbai", "delhi", "sheros", "jalandhar", "bengaluru"]
}
Graphql 架构:
type Query{
getCitiesForGroups: String
}
默认响应模板:
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0])
使用默认响应模板,我得到的结果
{ "data": { "getCitiesForGroups": [ "{groupcity=jaipur}", "{groupcity=mumbai}", "{groupcity=delhi}", "{groupcity=sheros}", "{groupcity=jalandhar}", "{groupcity=bengaluru}" ] } }
我的请求模板
{
"version": "2018-05-29",
"statements": [
"select DISTINCT LOWER(city) as city from public.Groups"
]
}
为了获得所需的输出,我更改了响应模板,因为我想遍历从数据库获得的响应,并使用给定的子字符串方法从字符串中删除 {city=}
[=24] =] 这就是我面临的问题。
我的回复模板
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
#set ($rawListOfCities = $utils.rds.toJsonObject($ctx.result)[0])
#set ($sanitisedListOfCities = [])
#foreach( $city in $rawListOfCities )
#set ($equalToIndex = $city.indexOf("="))
#set ($equalToIndex = $equalToIndex + 1)
#set ($curlyLastIndex = $city.lastIndexOf("}"))
#set ($tempCity = $city.substring($equalToIndex, $curlyLastIndex))
## #set ($tempCity = $city)
$util.qr($sanitisedListOfCities.add($tempCity))
#end
$util.toJson($sanitisedListOfCities)
我得到的回应:
{
"data": {
"getCitiesForGroups": "[null, null, null, null, null, null]"
}
}
然而,当我使用行 #set ($tempCity = $city)
并注释掉它上面的行时,我得到以下响应:
{
"data": {
"getCitiesForGroups": "[{city=jaipur}, {city=mumbai}, {city=delhi}, {city=sheros}, {city=jalandhar}, {city=bengaluru}]"
}
}
这意味着 $city
的值为 {city=jaipur}
,所以我想对其进行清理并将其添加到 ($sanitisedListOfCities)
和 return 作为响应。
但我得到 null
作为结果子字符串方法。
那么我如何清理来自 DB 和 return 的响应?
我遇到了类似的问题,我就是这样解决的。
首先,您的 Graphql 架构应该如下所示,
type Query {
getCitiesForGroups: cityList
}
type cityList {
cities: [String]
}
您的请求映射模板,
{
"version": "2018-05-29",
"statements": [
"select DISTINCT LOWER(city) as city from public.Groups"
]
}
最后是您的响应映射模板
#set($cityList = [])
#set($resMap = {})
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
#foreach($item in $utils.rds.toJsonObject($ctx.result)[0])
$util.qr($cityList.add($item.city))
#end
$util.qr($resMap.put("cities", $cityList))
#return($resMap)
预期响应(完成)
{
"data": {
"getCitiesForGroups": {
"cities": [
"jaipur",
"mumbai",
"delhi",
"sheros",
"jalandhar",
"bengaluru"
]
}
}
}
希望对您有所帮助。
这是我第一次使用 VTL,所以如果其中有非常愚蠢的地方,请更正我的代码。
我想达到的目标
{
"cities": ["jaipur", "mumbai", "delhi", "sheros", "jalandhar", "bengaluru"]
}
Graphql 架构:
type Query{
getCitiesForGroups: String
}
默认响应模板:
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
$utils.toJson($utils.rds.toJsonObject($ctx.result)[0])
使用默认响应模板,我得到的结果
{ "data": { "getCitiesForGroups": [ "{groupcity=jaipur}", "{groupcity=mumbai}", "{groupcity=delhi}", "{groupcity=sheros}", "{groupcity=jalandhar}", "{groupcity=bengaluru}" ] } }
我的请求模板
{
"version": "2018-05-29",
"statements": [
"select DISTINCT LOWER(city) as city from public.Groups"
]
}
为了获得所需的输出,我更改了响应模板,因为我想遍历从数据库获得的响应,并使用给定的子字符串方法从字符串中删除 {city=}
[=24] =] 这就是我面临的问题。
我的回复模板
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
#set ($rawListOfCities = $utils.rds.toJsonObject($ctx.result)[0])
#set ($sanitisedListOfCities = [])
#foreach( $city in $rawListOfCities )
#set ($equalToIndex = $city.indexOf("="))
#set ($equalToIndex = $equalToIndex + 1)
#set ($curlyLastIndex = $city.lastIndexOf("}"))
#set ($tempCity = $city.substring($equalToIndex, $curlyLastIndex))
## #set ($tempCity = $city)
$util.qr($sanitisedListOfCities.add($tempCity))
#end
$util.toJson($sanitisedListOfCities)
我得到的回应:
{
"data": {
"getCitiesForGroups": "[null, null, null, null, null, null]"
}
}
然而,当我使用行 #set ($tempCity = $city)
并注释掉它上面的行时,我得到以下响应:
{
"data": {
"getCitiesForGroups": "[{city=jaipur}, {city=mumbai}, {city=delhi}, {city=sheros}, {city=jalandhar}, {city=bengaluru}]"
}
}
这意味着 $city
的值为 {city=jaipur}
,所以我想对其进行清理并将其添加到 ($sanitisedListOfCities)
和 return 作为响应。
但我得到 null
作为结果子字符串方法。
那么我如何清理来自 DB 和 return 的响应?
我遇到了类似的问题,我就是这样解决的。
首先,您的 Graphql 架构应该如下所示,
type Query {
getCitiesForGroups: cityList
}
type cityList {
cities: [String]
}
您的请求映射模板,
{
"version": "2018-05-29",
"statements": [
"select DISTINCT LOWER(city) as city from public.Groups"
]
}
最后是您的响应映射模板
#set($cityList = [])
#set($resMap = {})
#if($ctx.error)
$utils.error($ctx.error.message, $ctx.error.type)
#end
#foreach($item in $utils.rds.toJsonObject($ctx.result)[0])
$util.qr($cityList.add($item.city))
#end
$util.qr($resMap.put("cities", $cityList))
#return($resMap)
预期响应(完成)
{
"data": {
"getCitiesForGroups": {
"cities": [
"jaipur",
"mumbai",
"delhi",
"sheros",
"jalandhar",
"bengaluru"
]
}
}
}
希望对您有所帮助。