Бессерверный API шлюз, преобразовывающий запрос в base64
У меня есть серверное приложение, которое загружает файлы в s3 (через запрос POST) и обслуживает их (через запрос GET)
я использую serverless-apigw-binary
а также serverless-apigwy-binary
плагины, позволяющие мне возвращать двоичные данные в виде изображения. Чтобы позволить 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
1 ответ
У вас есть два варианта:
Прекратить использование
*/*
в качестве селектора типа. Это обрабатывает все как двоичный файл и, следовательно, все кодирует base64. К сожалению, вы не можете выразить исключение из правила, только те вещи, которые следуют этому правилу. Вы можете добавить исчерпывающий список типов, которые должны рассматриваться как двоичные, но для меня это звучит хрупко.Просто примите base64 JSON и удалите base64 с другой стороны. Это кажется самым простым. Похоже, вы используете узел, и по этому поводу есть множество учебных пособий. Конечно, это добавляет некоторые шаги и немного раздувается, но давайте будем честными, вы используете API Gateway и Lambda (которые являются хорошими инструментами, но...), поэтому очевидно, что производительность здесь не должна настраиваться на миллисекунду,