API网关集成响应模型模板 - 删除属性

时间:2017-06-29 01:55:48

标签: aws-api-gateway

我已经联系过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") 

和一些变化。

还有其他人有可能的解决方案吗?

由于

2 个答案:

答案 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的本机函数,因此,您需要重新构建它手动或使用上面的每个代码段。我仍然试图找到另一种解决方法。