【发布时间】:2019-01-30 00:16:54
【问题描述】:
在为 AWS Lambda(Java/Scala)编写函数时,处理函数可以具有不同的签名之一:
// Raw input / output
def handleRequest(is: InputStream): OutputStream = ???
// Using the AWS dependency
def handleRequest(input: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent = ???
这是我所知道的至少两个可能的签名。也许还有更多。
不同之处在于第一个是原始响应,需要由 API 网关使用手动配置的媒体类型和响应代码等属性打包到 REST 响应中。
第二个响应似乎利用了 Lambda 代理集成,并将从 APIGatewayProxyResponse 中提取所有配置。
现在回答我的问题:
APIGatewayProxyResponse 的字段 body 的类型为 String。
在我看来,这个 POJO 在发送到 API 网关之前被序列化为 JSON。
这将导致无法提供图像或 PDF 文件等二进制数据。
原始的OutputStream 不能携带有关标头等的信息(或者可以吗?),这意味着我不能提供多种不同的媒体类型。
当然,我可以将图像转换为 Base64。但这远非最佳。
有没有一种方法可以在单个 AWS Lambda 处理程序中提供不同的(二进制和非二进制)媒体类型(具有正确的标头等)?我必须如何为此配置 API 网关?
【问题讨论】:
-
您可以将用户输出流以 json 格式发送发送完整响应(包括标头)。 JSONObject 响应 = 新 JSONObject(); response.put("headers", headerJsonObject); response.put("body", responseBody.toString());OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
-
@Kaushal 好的,但我很确定我不会被允许只将二进制垃圾写入 JSON。
-
对于二进制,不要发送 json 响应。根据情况在输出流中发送 json 或二进制。 API 网关 api 可以根据其配置来处理响应。示例docs.aws.amazon.com/apigateway/latest/developerguide/…
-
@Kaushal 我的问题是关于可以both 的单个处理程序。
标签: scala amazon-web-services aws-lambda