我已经联系过AWS支持,并被告知目前这是不可能的,但是,我很难相信这一点,并希望获得第二意见。
我的情况是这样的:
我目前有一个API,我们在请求和响应上使用模型模板......看起来像这样的东西(在集成请求中):
#set($input = $input.body)
#set( $newbody = $input.replace("CostRecoveryGUID",
"CostRecoveryId").replace("InvoiceItemGUID", "InvoiceItemId"))
$newbody
这会按预期返回模型,但是,它首先替换了一些属性名称 - 这非常正常。
我想接收body对象(在响应中)并从响应中删除整个属性。我知道这可能听起来像一个奇怪的情况,然而,这是必要的。
所以,假设代码相同 - 我试过这样的事情:
#set($input = $input.body)
#set( $newbody = $input.replace("CostRecoveryGUID",
"CostRecoveryId").replace("InvoiceItemGUID",
"InvoiceItemId").remove("PropertyName"))
$newbody
不幸的是哪个不起作用。
我也试过
#set( $newbody = $newbody.delete("PropertyName")
和一些变化。
还有其他人有可能的解决方案吗?
由于
答案 0 :(得分:1)
不幸的是,API Gateway并不支持本机以JSON格式从正文中删除属性,但您可以通过使用 .replaceAll(" regex&#34)来实现这一点。 ;,"替换"),就像字符串操作操作一样。
如果要从JSON正文中删除名为 test2 的属性,可以像这样定义模板,
<强>模板:强>
#set($propertyRegex = ',?\s*"?test2"? *: *"?\w*"?')
$input.body.replaceAll($propertyRegex, "")
转型前:
{
"test1" : "value1",
"test2" : "value2",
"test3" : "value3"
}
转型后:
{
"test1" : "value1",
"test3" : "value3"
}
我希望它有所帮助
答案 1 :(得分:0)
虽然Ka Hou leong已经回答了这个问题,但我发现了另一种方法可以实现同样的目的,而不必使用正则表达式,如果其他人有兴趣的话。
要完全删除属性,我们必须将其视为对象。例如,您可以使用$ input.path(x)方法[1]来获取JSON的对象表示。一旦我们有了一个对象,我们就可以执行与对象相关的方法,如&#34; remove&#34;在对象上。下面的代码段:
##get an object representation of the JSON string
#set($input = $input.path('$'))
##This removes property obj1 from the input json
#set($val = $input.remove("obj1"))
##reconstruct the JSON from the object if required
{
#foreach($key in $input.keySet())
#set($x = $input.get($key))
"$key": "$x"
#end
}
测试:
当我给出以下输入体时,
{
"obj1": "1st object",
"obj2": "2nd object"
}
我能够在转换后获得以下端点请求体:
{
"obj2": "2nd object"
}
即,删除了obj1。
注意:这将返回一个字符串结果,并且当前(通过AWS Support确认)没有将字符串转换回JSON的本机函数,因此,您需要重新构建它手动或使用上面的每个代码段。我仍然试图找到另一种解决方法。