无服务器 API 网关将请求转换为 base64
Serverless API gateway transforming request into base64
我有一个无服务器应用程序,它可以将文件上传到 s3(通过 POST 请求)并提供它们(通过 GET 请求)
我正在使用 serverless-apigw-binary
和 serverless-apigwy-binary
插件来允许我 return 图像形式的二进制数据。为了让 URL 与浏览器一起工作,我必须将二进制类型设置为 */*
。
为了上传图片,POST 端点需要一个像 { "base64": "..." } 这样的正文。然而,通过这种配置,整个主体都以 base64 编码的字符串形式出现。如何防止 application/json
的请求正文被转换?
见下文serverless.yml
:
service: image-service
custom:
envName: ${opt:stage, self:provider.stage}
domains:
prod: api.<mydomain>
dev: dev-api.<mydomain>
customDomain:
basePath: images
domainName: ${self:custom.domains.${self:custom.envName}}
certificateName: "*.<mydomain>"
apigwBinary:
types:
- '*/*'
provider:
name: aws
runtime: nodejs8.10
region: eu-west-1
memorySize: 1536
role: ImageRenderingRole
environment:
ENV_NAME: ${self:custom.envName}
APP_NAME: image-service
BUCKET: <mybucket>
plugins:
- serverless-offline
- serverless-domain-manager
- serverless-apigw-binary
- serverless-apigwy-binary
functions:
uploadImage:
handler: handler.uploadImage
events:
- http:
path: /
method: POST
getImage:
handler: handler.getImage
events:
- http:
path: 'images/{idAndFormat}'
method: get
contentHandling: CONVERT_TO_BINARY
parameters:
paths:
idAndFormat: true
您有两个选择:
停止使用 */*
作为类型选择器。这是将所有内容都视为二进制,因此对所有内容进行 base64 编码。不幸的是,您不能表达规则的例外情况,只能表达遵循规则的事情。您可以添加必须被视为二进制类型的完整列表,但这对我来说听起来很脆弱。
只需接受 base64 JSON 并在另一端反 base64。这似乎是最简单的。您正在使用节点,看起来像,并且有大量关于此的教程。当然,它增加了一些步骤和一些臃肿,但老实说,您使用的是 API Gateway 和 Lambda(这是很好的工具,但是......)所以显然不必调整性能此处精确到毫秒。
我有一个无服务器应用程序,它可以将文件上传到 s3(通过 POST 请求)并提供它们(通过 GET 请求)
我正在使用 serverless-apigw-binary
和 serverless-apigwy-binary
插件来允许我 return 图像形式的二进制数据。为了让 URL 与浏览器一起工作,我必须将二进制类型设置为 */*
。
为了上传图片,POST 端点需要一个像 { "base64": "..." } 这样的正文。然而,通过这种配置,整个主体都以 base64 编码的字符串形式出现。如何防止 application/json
的请求正文被转换?
见下文serverless.yml
:
service: image-service
custom:
envName: ${opt:stage, self:provider.stage}
domains:
prod: api.<mydomain>
dev: dev-api.<mydomain>
customDomain:
basePath: images
domainName: ${self:custom.domains.${self:custom.envName}}
certificateName: "*.<mydomain>"
apigwBinary:
types:
- '*/*'
provider:
name: aws
runtime: nodejs8.10
region: eu-west-1
memorySize: 1536
role: ImageRenderingRole
environment:
ENV_NAME: ${self:custom.envName}
APP_NAME: image-service
BUCKET: <mybucket>
plugins:
- serverless-offline
- serverless-domain-manager
- serverless-apigw-binary
- serverless-apigwy-binary
functions:
uploadImage:
handler: handler.uploadImage
events:
- http:
path: /
method: POST
getImage:
handler: handler.getImage
events:
- http:
path: 'images/{idAndFormat}'
method: get
contentHandling: CONVERT_TO_BINARY
parameters:
paths:
idAndFormat: true
您有两个选择:
停止使用
*/*
作为类型选择器。这是将所有内容都视为二进制,因此对所有内容进行 base64 编码。不幸的是,您不能表达规则的例外情况,只能表达遵循规则的事情。您可以添加必须被视为二进制类型的完整列表,但这对我来说听起来很脆弱。只需接受 base64 JSON 并在另一端反 base64。这似乎是最简单的。您正在使用节点,看起来像,并且有大量关于此的教程。当然,它增加了一些步骤和一些臃肿,但老实说,您使用的是 API Gateway 和 Lambda(这是很好的工具,但是......)所以显然不必调整性能此处精确到毫秒。