Velocity模板将无效的JSON解析为有效的JSON

时间:2017-10-06 23:51:09

标签: amazon-web-services mapping velocity aws-api-gateway

我有以下模板,它的工作原理如下:

#set($allParams = $input.params())
{
    "body" : $input.json('$'),
    "params" : {
    #foreach($type in $allParams.keySet())
        #set($params = $allParams.get($type))
        "$type" : {
        #foreach($paramName in $params.keySet())
            "$paramName" : "$util.escapeJavaScript($params.get($paramName))"#if($foreach.hasNext),#end
        #end
        }#if($foreach.hasNext),#end
    #end
    }
}

对我来说麻烦的是这个模板仍然会解析无效的JSON。

例如,在转换之前给出以下无效JSON:

{
    "example": !@#$%^&*()_+
}

使用上面的模板将其转换为:

{
    "body" : {
        "asdasd": "!@#$%^&*()"
    },
    ...
}

我的问题是为什么?不应该$input.json('$')无法解析无效的JSON字符串吗?

下面的编辑日志:

Execution log for request test-request
Fri Oct 06 21:27:13 UTC 2017 : Starting execution for request: test-invoke-request
Fri Oct 06 21:27:13 UTC 2017 : HTTP Method: POST, Resource Path: /equipment
Fri Oct 06 21:27:13 UTC 2017 : Method request path: {}
Fri Oct 06 21:27:13 UTC 2017 : Method request query string: {}
Fri Oct 06 21:27:13 UTC 2017 : Method request headers: {}
Fri Oct 06 21:27:13 UTC 2017 : Method request body before transformations: {
    "asdasd": 123123$%^&*()
}
Fri Oct 06 21:27:13 UTC 2017 : Endpoint request body after transformations: {
    "body" : {"asdasd":"123123$%^&*()"},
    "params" : {
....

1 个答案:

答案 0 :(得分:0)

我能够通过使用请求正文模型来解决我的问题:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Example",
    "type": "object",
    "required": [
        "example"
    ],
    "properties": {
        "example": {
            "type":"string"
        }
    }
}

因此,在将请求体发送给Lambda之前,API网关将针对上方的JSON模式模型检查请求正文。