Gam*_*ids 10 java json amazon-web-services aws-lambda aws-api-gateway
我有一个用Java编写的AWS Lambda函数,它由AWS API Gateway调用触发.
我正在尝试POST使用JSON作为有效负载向其中一个端点发出请求.
curl -H "Content-Type: application/json" -X POST -d '{"firstName":"Mr", "lastName":"Awesome"}' https://someexample.execute-api.eu-central-1.amazonaws.com/beta/MethodHandlerLambda
Run Code Online (Sandbox Code Playgroud)
然后网关将检测的Content-Type,并通过一个缺省传递所有请求参数(包括人体)的模板.有趣的是这一部分
#set($allParams = $input.params())
{
"body-json" : $input.json('$'),
....
Run Code Online (Sandbox Code Playgroud)
它应该向我提供一个Map<String, Object>传递给我的Java方法:
public void myHandler(Map<String, Object> input, Context context){
input.keySet().forEach((key) -> {
System.out.println(key + " : " + input.get(key));
});
}
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的:
body-json : {"firstName":"Mr", "lastName":"Awesome"}
...
Run Code Online (Sandbox Code Playgroud)
但我得到的是这样的:
body-json : {firstName=Mr, lastName=Awesome}
Run Code Online (Sandbox Code Playgroud)
另一种可能性是将整个身体作为字符串传递:
"body" : $input.body
Run Code Online (Sandbox Code Playgroud)
但那又是"转换" key=value而不是key:value
我如何配置模板只是简单地传递给我身体,以便我可以在JSON解析器中使用它?
再一次 - 只需在SO上发布一个问题就可以自己找到答案:)
在AWS Api Gateway模板中,我将主体设置为
"body-json" : $input.body
Run Code Online (Sandbox Code Playgroud)
这应该返回完整有效载荷为一个字符串.
但更重要的是我读Greggs回答了自己的问题,并改变了我的方法来
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());
}
Run Code Online (Sandbox Code Playgroud)
因此,只需简单地将其InputStream读取为JsonNode任何JSON库(我使用的是Jackson FasterXML)就足够了.瞧,它将所有可能的参数打包在一个JSON中(由模板指定)
{
"body-json": {
"firstName": "Mr",
"lastName": "Awesome"
},
"params": {
...
},
"stage-variables": {
...
},
"context": {
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9908 次 |
| 最近记录: |