无服务器API网关将请求转换为base64

时间:2018-09-24 12:56:09

标签: aws-api-gateway serverless-framework aws-serverless

我有一个无服务器应用程序,可以将文件上传到s3(通过POST请求)并提供文件(通过GET请求)

我正在使用serverless-apigw-binaryserverless-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 个答案:

答案 0 :(得分:1)

您有两个选择:

  1. 使用*/*作为类型选择器停止。这将所有内容都视为二进制,因此base64会对其进行编码。不幸的是,您不能仅对遵循规则的事物表示例外。您可以添加必须视为二进制的类型的综合列表,但这对我来说听起来很脆弱。

  2. 仅接受base64 JSON,然后在另一端对其进行de-base64处理。这似乎最简单。您正在使用节点,看起来很像,并且有很多关于此的教程。当然,它增加了一些步骤并有些膨胀,但是老实说,您使用的是API Gateway和Lambda(它们是不错的工具,但是...),因此显然不必在这里将性能调到毫秒。