如何使用无服务器框架将二进制内容从节点 JS AWS lambda 后端传递到 API 网关?
How can I pass binary content to API Gateway from node JS AWS lambda backend using Serverless framework?
据我们所知,API 网关和 lambda 支持二进制 request/response,但我有一个关于节点后端编程的问题 JavaScript。
环境:
- 使用无服务器框架,集成 lambda(不是 lambda-proxy)。
- 响应头映射为:
内容类型:integration.response.body.headers.Content-类型
- 响应模板映射为:
image/png: $input.path('$.body')
image/jpeg: $input.path('$.body')
- 为 image/png 和 image/jpeg
启用二进制支持
对于上述环境,在我的代码中我将响应内容作为二进制(缓冲区对象数组)。
但是,如果我直接将 Buffer 对象数组作为响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body
});
接收响应是这样的:
Content-type: image/jpeg
{type=Buffer, data=[255,216,255,224,0,16,74,70,73,70,0...
如果我将 Buffer 对象数组作为 base64 编码的响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body.toString('base64')
});
接收响应是这样的:
Content-type: image/jpeg
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDA...
如何使用无服务器框架从节点 JS 后端向 API 网关提供二进制响应?
== PostScript ==
根据这份文件:
我们必须将集成响应更改的 "Content Handling" 设置为 "CONVERT TO BINARY",以响应二进制响应。
但是我该如何设置呢?
我不知道 serverless.yml 和 AWS 控制台 GUI。
如果我成功设置此内容处理 => 转换为二进制,我可以解决响应二进制响应吗?
== 1 月 17 日编辑 ==
嗨@ka-hou-ieong
你写了rest-api-id和resource-id,它们在下图中,对吧?
但是使用这些 id,命令结果为:
$aws apigateway put-integration-response --rest-api-id XXXXXXXX --resource-id XXXXXX --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY
An error occurred (NotFoundException) when calling the PutIntegrationResponse operation: Invalid Resource identifier specified
这有什么问题吗?我使用最新的 aws-cli (aws-cli/1.11.37 Python/2.7.9 Darwin/16.3.0 botocore/1.5.0)
如果您想将响应强制为二进制响应,您可以通过 AWS CLI 或 API 将 'CONVERT_TO_BINARY' 设置为集成响应的 contentHandling。目前,我们在控制台上缺少此选项。
API
PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration/responses/<status_code>
{
"patchOperations" : [ {
"op" : "replace",
"path" : "/contentEncoding",
"value" : "CONVERT_TO_BINARY"
}]
}
CLI
aws apigateway put-integration-response --rest-api-id xxxxxxx --resource-id xxxxx --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY
据我们所知,API 网关和 lambda 支持二进制 request/response,但我有一个关于节点后端编程的问题 JavaScript。
环境:
- 使用无服务器框架,集成 lambda(不是 lambda-proxy)。
- 响应头映射为:
内容类型:integration.response.body.headers.Content-类型 - 响应模板映射为:
image/png: $input.path('$.body')
image/jpeg: $input.path('$.body') - 为 image/png 和 image/jpeg 启用二进制支持
对于上述环境,在我的代码中我将响应内容作为二进制(缓冲区对象数组)。
但是,如果我直接将 Buffer 对象数组作为响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body
});
接收响应是这样的:
Content-type: image/jpeg
{type=Buffer, data=[255,216,255,224,0,16,74,70,73,70,0...
如果我将 Buffer 对象数组作为 base64 编码的响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body.toString('base64')
});
接收响应是这样的:
Content-type: image/jpeg
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDA...
如何使用无服务器框架从节点 JS 后端向 API 网关提供二进制响应?
== PostScript ==
根据这份文件:
我们必须将集成响应更改的 "Content Handling" 设置为 "CONVERT TO BINARY",以响应二进制响应。
但是我该如何设置呢?
我不知道 serverless.yml 和 AWS 控制台 GUI。
如果我成功设置此内容处理 => 转换为二进制,我可以解决响应二进制响应吗?
== 1 月 17 日编辑 ==
嗨@ka-hou-ieong
你写了rest-api-id和resource-id,它们在下图中,对吧?
但是使用这些 id,命令结果为:
$aws apigateway put-integration-response --rest-api-id XXXXXXXX --resource-id XXXXXX --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY
An error occurred (NotFoundException) when calling the PutIntegrationResponse operation: Invalid Resource identifier specified
这有什么问题吗?我使用最新的 aws-cli (aws-cli/1.11.37 Python/2.7.9 Darwin/16.3.0 botocore/1.5.0)
如果您想将响应强制为二进制响应,您可以通过 AWS CLI 或 API 将 'CONVERT_TO_BINARY' 设置为集成响应的 contentHandling。目前,我们在控制台上缺少此选项。
API
PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration/responses/<status_code>
{
"patchOperations" : [ {
"op" : "replace",
"path" : "/contentEncoding",
"value" : "CONVERT_TO_BINARY"
}]
}
CLI
aws apigateway put-integration-response --rest-api-id xxxxxxx --resource-id xxxxx --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY