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

11

我有一个无服务器应用程序,可以通过POST请求将文件上传到S3并通过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个回答

10

你有两个选择:

  1. 停止使用 */* 作为类型选择器。这会将所有内容视为二进制,并因此将所有内容进行base64编码。不幸的是,您无法表达规则的例外,只能表达遵循规则的内容。您可以添加一个详尽的类型列表,以便将必须视为二进制的类型排除在外,但我认为这样做容易出错。

  2. 接受base64 JSON并在另一端进行解码。这似乎是最简单的方法。您正在使用Node,看起来有充足的教程可供使用。当然,它增加了一些步骤和一些冗余,但让我们诚实一点,您正在使用API Gateway和Lambda(这是不错的工具,但...),所以性能显然不必调整到毫秒级。


谢谢,伙计,很有道理。 - Mel Macaluso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接