首页 > 解决方案 > 是否可以使用 Java 开发工具包在对 AWS Lambda 的调用请求中包含标头和查询参数

问题描述

我通过使用Invoke从 AWS Java SDK 直接调用它来替换我的 Lambda 前面的 AWS API Gateway

InvokeRequest request = new InvokeRequest();
try {
    request.putCustomQueryParameter("city", "Seattle");
    request.withFunctionName(functionName).withPayload(ByteBuffer.wrap(IOUtils.toByteArray(content)));
} catch (IOException e1) {
    e1.printStackTrace();
}

有没有办法将标头或查询参数与请求一起传递?我尝试了上面的代码,但我只能发送有效载荷。

标签: javaamazon-web-servicesaws-lambdamulemulesoft

解决方案


快速回答: putCustomRequestHeader只能用于将请求标头添加到发送到 AWS Lambda 服务的 HTTP 请求中。它们不会被转发到 AWS Lambda 函数。

长答案:我相信您在这里混淆了两种不同的东西,并且对术语有误解。如果您调用 AWS Lambda 函数,您将向 AWS Lambda 服务发送 HTTP 请求,然后该服务将执行 Lambda 函数的实际调用(并将您的有效负载数据转发到该函数)。例如,AWS Lambda 服务会查看是否有空闲函数并使用它,否则它会启动您的函数的新实例并使用它。

a) 直接调用 AWS Lambda

如果您想使用 AWS 开发工具包调用 AWS Lambda 函数,您可以在代码中执行此操作,例如 Java 程序:

Java Program --> Invoke AWS Lambda Function

这意味着,您的代码直接调用 Lambda 函数。在这种情况下,您只能向函数提供有效负载。如果要添加任何“附加”数据,则只能扩展有效负载数据。

b) 间接调用 AWS Lambda

然后有一种方法可以“间接”调用 Lambda 函数,例如位于 API 网关后面的函数。这样的 Lambda 函数可以接收 HTTP 标头和查询参数,因为 API Gateway 正在接收 HTTP 请求并将 HTTP 事件转发到 AWS Lambda 函数:

Java Program --> Send HTTP request --> API Gateway receives HTTP --> API Gateway invokes AWS Lambda Function with HTTP event data

在 API Gateway 调用 AWS Lambda 函数的最后一步中,API Gateway 还将“仅”调用 Lambda 函数。但它提供了所有 HTTP 数据(它之前收到的)作为 Lambda 函数的有效负载数据。这就是在这种情况下您可以访问 HTTP 标头和查询参数的原因。

解决您的问题

如果您确实需要提供 HTTP 标头或查询参数,请在您的函数前面放置一个 API 网关。但是,如果您只想从代码中调用您的函数,那么只需扩展您正在发送的有效负载数据并添加您想要提供的数据。


推荐阅读