2017-06-27 68 views
3

我有一个用Java编写的AWS Lambda函数,它由AWS API网关调用触发。将POST请求正文通过Amazon API Gateway传递到Lambda

我正在尝试使用JSON作为有效负载向其中一个终端发出POST请求。

curl -H "Content-Type: application/json" -X POST -d '{"firstName":"Mr", "lastName":"Awesome"}' https://someexample.execute-api.eu-central-1.amazonaws.com/beta/MethodHandlerLambda 

网关将然后检测Content-Type并通过默认template传递所有请求参数(包括人体)。有趣的是这一个

#set($allParams = $input.params()) 
{ 
"body-json" : $input.json('$'), 
.... 

它应该是目前我传递给我的Java方法的Map<String, Object>

public void myHandler(Map<String, Object> input, Context context){ 
    input.keySet().forEach((key) -> { 
     System.out.println(key + " : " + input.get(key)); 
    }); 
} 

而结果应该是这样的:

body-json : {"firstName":"Mr", "lastName":"Awesome"} 
... 

但我得到的是这样的:

body-json : {firstName=Mr, lastName=Awesome} 

另一种可能性是将整个身体传递作为字符串:

"body" : $input.body 

但是又只是“转换”到key=value代替key:value

如何必须配置模板只需传递给我的身体,以便我可以在JSON解析器中使用它?

回答

4

并再次 - 只是张贴在这里SO问题有助于找到你自己:)答案

在我身上设置为

"body-json" : $input.body 

的AWS API网关模板,以字符串形式返回完整的有效内容。

但更重要的是我读Greggs answer to his own question和改变了我的方法

public void myHandler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException{ 
    final ObjectMapper objectMapper = new ObjectMapper(); 
    JsonNode json = objectMapper.readTree(inputStream); 
    System.out.println(json.toString());   
} 

所以,它足以有一个简单的InputStream,并把它读作与任何JSON库一个更喜欢JsonNode(我使用Jackson FasterXML)。并且,瞧,它将所有可能的参数打包在单个JSON中(如模板所指定的)

{ 
    "body-json": { 
     "firstName": "Mr", 
     "lastName": "Awesome" 
    }, 
    "params": { 
     ... 
    }, 
    "stage-variables": { 
     ... 
    }, 
    "context": { 
     ... 
    } 
} 
相关问题