当前位置: 首页 > 知识库问答 >
问题:

将POST请求正文通过Amazon API网关传递到Lambda

东郭淇
2023-03-14

我有一个用Java编写的AWS Lambda函数,它由AWS API网关调用触发。

我试图向其中一个endpoint发出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

然后,网关将检测内容类型,并通过默认模板传递所有请求参数(包括正文)。有趣的是这一部分

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

它应该给我一张地图

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解析器中使用它?


共有1个答案

皮安顺
2023-03-14

再说一次——在这里发布一个问题,这样有助于自己找到答案:)

在AWS Api网关模板中,我将主体设置为

"body-json" : $input.body

它应该以String的形式返回完整的负载。

但更重要的是,我读了格雷格对自己问题的回答,并把我的方法改为

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并将其作为JsonNode读取就足够了,可以使用任何喜欢的JSON库(我使用的是Jackson-FasterXML)。瞧,它将所有可能的参数打包在一个JSON中(由模板指定)

{
    "body-json": {
        "firstName": "Mr",
        "lastName": "Awesome"
    },
    "params": {
       ...
    },
    "stage-variables": {
       ...
    },
    "context": {
        ...
    }
}
 类似资料:
  • 问题内容: 我已经按照npm软件包文档中的建议编写了axios POST请求,例如: 它可以工作,但是现在我修改了后端API以接受标头。 内容类型:“ application / json” 授权:“ JWT fefege …” 现在,此请求在Postman上可以正常工作,但是在编写axios调用时,我遵循 此链接 ,无法完全正常工作。 我经常出错。 这是我的修改请求: 任何帮助是极大的赞赏。 问

  • 问题内容: 我正在尝试使用 nodejs 和 请求 [2] 向google QPX Express API [1]发出HTTP POST请求。 我的代码如下: 我想做的是使用multipart参数[3]传递JSON。但是我没有正确的JSON响应,而是收到一个错误(未定义400)。 当我使用CURL使用相同的JSON和API密钥发出请求时,它工作正常。因此,我的API密钥或JSON没错。 我的代码有

  • 问题内容: 如何通过python模块Requests传递csrftoken?这就是我所拥有的,但是它不起作用,并且我不确定将其传递给哪个参数(数据,标头,身份验证…) 每次都有相同的错误消息。 问题答案: 如果要设置引荐来源标头,则对于该特定站点,您需要将引引来源设置为与登录页面相同的URL: 当使用不安全时,标头通常会被过滤掉,否则无论如何很容易被欺骗,因此大多数站点不再需要设置标头。但是,在使

  • 如果我添加了一个特定的方法,比如POST而不将其设置为Lambda代理集成,那么我确实会看到provide request body data将其添加到Lambda函数中,并正确地反序列化到POJO中,然后返回 所以现在看起来一切都很好,但是当我使用HTTP方法POST对来自PostMan的AWS API URL进行实际测试时,我得到了以null作为约会Id的响应,并且我可以在CloudWatch

  • 我有一个使用Cognito用户池授权器的方法。我想从上下文中获取主体Id,并通过自定义头传递给集成endpoint。我试过语境。授权人。一无所有的原则。i、 e标题没有显示。如果我设置为“硬编码”,它将显示。其他上下文选项,比如appId,似乎是Cognito特有的。 本质上,我试图让API网关处理工作中的令牌验证部分。