调用 AWS Lambda Java 函数的 AWS 网关收到空正文

Posted

技术标签:

【中文标题】调用 AWS Lambda Java 函数的 AWS 网关收到空正文【英文标题】:AWS Gateway calling AWS Lambda Java Function receives null body 【发布时间】:2020-09-20 19:24:17 【问题描述】:

我正在使用 aws-lambda-java-events 库实现一个用 java 编码的 aws lambda 函数。出于故障排除的目的,我现在只是尝试使用相同的请求正文进行回复

public class LambdaFunctionHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> 
    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) 
        return new APIGatewayProxyResponseEvent().withBody(input.getBody());
    

我已经定义了上面的 lambda 函数和一个 api 网关,但我得到了 input.getBody 为空。 lambda函数的输出是一个空的json对象


我通过 AWS lambda 测试控制台对此进行了测试。执行成功,输出如上。 api 网关集成请求配置为在 POST 方法上调用上述 lambda 函数。

以下是我的疑问

    如何获取 aws 测试事件 json 作为 APIGatewayProxyRequestEvent getBody() 字符串的一部分? 如何将请求正文传递给APIGatewayProxyRequestEvent getBody() 字符串变量中的API Gateway POST 方法?我需要定义映射模板吗?如果是这样,它应该是什么样子(我多次尝试但没有成功)

我想通过POSTMAN传递给API网关POST方法的请求体是


    "question":"Hello, how are you doing?"

谢谢!

【问题讨论】:

你是如何测试它的?我猜你是从 lambda 控制台测试它作为一个正常事件。对吗? 是的,我刚刚意识到我需要使用网关代理事件来测试它。 【参考方案1】:

我也试过了。我使用的代码是

public class LambdaFunctionHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> 

    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent,
            Context context) 
        return new APIGatewayProxyResponseEvent().withBody(apiGatewayProxyRequestEvent.getBody());
    

我猜您是直接从 AWS 控制台进行测试。您不能直接测试事件触发的 lambda。

您必须使用“Amazon API Gateway 代理”事件创建测试,如下所示。

并将请求正文作为参数的一部分传递。

有了这些输入,我得到了预期的输出。

【讨论】:

感谢您将我的注意力转移到网关代理事件上。如何修改 json 以指定自定义请求正文?我需要创建一个 api 网关并在此处指定它的详细信息吗? 当您提到自定义请求正文时,您的意思是说响应需要完全按照您在问题中提到的方式吗?如果是这样,您可以传递 body 属性的值,如下所示。 "body": "'question':'你好,你好吗?'",我得到的请求输出是 "body": "'question':'你好,你好吗?' " 这能回答你的问题吗?

以上是关于调用 AWS Lambda Java 函数的 AWS 网关收到空正文的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JAVA 调用 AWS lambda 函数?

从java lambda调用aws Step函数

使用 AWS SDK for Java 调用 AWS Lambda 函数时如何检索 context.done() 消息?

AWS Lambda 中的资源释放

AWS Lambda函数对在EC2中部署的api进行rest api调用

AWS lambda 函数调用另一个带参数的 lambda 函数