Бессерверный 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 ответ

Решение

У вас есть два варианта:

  1. Прекратить использование */* в качестве селектора типа. Это обрабатывает все как двоичный файл и, следовательно, все кодирует base64. К сожалению, вы не можете выразить исключение из правила, только те вещи, которые следуют этому правилу. Вы можете добавить исчерпывающий список типов, которые должны рассматриваться как двоичные, но для меня это звучит хрупко.

  2. Просто примите base64 JSON и удалите base64 с другой стороны. Это кажется самым простым. Похоже, вы используете узел, и по этому поводу есть множество учебных пособий. Конечно, это добавляет некоторые шаги и немного раздувается, но давайте будем честными, вы используете API Gateway и Lambda (которые являются хорошими инструментами, но...), поэтому очевидно, что производительность здесь не должна настраиваться на миллисекунду,

Другие вопросы по тегам