java - 是否可以使用 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();
}
有没有办法将标头或查询参数与请求一起传递?我尝试了上面的代码,但我只能发送有效载荷。
解决方案
快速回答: 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 网关。但是,如果您只想从代码中调用您的函数,那么只需扩展您正在发送的有效负载数据并添加您想要提供的数据。
推荐阅读
- postgresql - 如何在 Postgresql 上安装 BINGO?
- python - 不能将 dict.values() 与 min func 的键一起使用
- php - 如何使用 PHP 包含基于 URL 文件名打印 HTML 代码
- android - 地理围栏 PendingIntent 始终为空
- python - 使用新列更新熊猫数据框
- interface - 在 BPMN 中 - 如何对两个组件之间的详细信息(字段)接口进行建模?
- docker - 如何在 docker 上共享挂载目录的所有权?
- c# - 没有设置器,DataTrigger EnterActions 不起作用?
- hierarchy - 获取父子层次结构
- python-3.x - 为什么在下面示例中的 for 循环中,两个示例中的每个示例中的第二个 for 循环中的结果都不完全相同