AWS API Gateway: поддержка форм-данных

Можно ли отправить запрос с: Content-Type: multipart / form-data в API Gateway?

В моем случае я пытаюсь отправить данные формы, как показано ниже, через почтальона:

user[email]:extest829@ex.com
user[password]:password
user[password_confirmation]:password
user[username]:testUser

Но похоже, что API Gateway теряет контент.

Все отлично работает, когда я отправляю это как: application / x-www-form-urlencoded или application / json.

3 ответа

Решение

Использование mulipart/form-data не полностью поддерживается AWS API Gateway, особенно когда мы пытаемся отправить файл через mulipart/form-data.

Для отправки изображения вместе с другими данными из формы, вероятно, лучшим решением будет отправить его в формате JSON, где изображение кодируется с помощью base64.

Например, когда кто-то хочет отправить:

  1. Имя пользователя (строка)
  2. Аватар (изображение)

Аватар должен быть закодирован с base64. Это дает изображение в виде текста, например:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyA...

Содержание сообщения POST будет:

{
    "user_account": {
           "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyA...",
           "username": "my name"
    }
}

API-шлюз

В API Gateway, в вашем API, откройте Модели и создайте новую модель, например, UserAccount:

{
   "$schema": "http://json-schema.org/draft-04/schema#",
   "title": "UserAccountUpdate",
   "type": "object",
   "properties": {
   "user": {
      "type": "object",
      "properties": {
          "avatar": { "type": "string" },
          "username": { "type": "string" }
     }
   }
  }
}

В запросе метода -> Заголовки HTTP-запроса: Content-Type,

В запросе метода -> Тело запроса: application/json и в качестве модели использовать созданную модель UserAccount.

В Запросе на интеграцию -> Обработка контента задается как: Passthrough.

В Запросе на интеграцию -> Шаблоны отображения тела выберите: Когда ни один шаблон не соответствует повторному запросу заголовка Content-Type. (Вы также можете использовать два других параметра здесь и установить дополнительные шаблоны отображения).

Backend

Backend получает изображение в виде текста, закодированного с base64. Поэтому, вероятно, прежде чем использовать дальше, ему нужно декодировать его из текста в изображение.

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

Когда вы отправляете запрос с Content-Type: multipart/form-data в API Gateway, вам необходимо передать исходный заголовок Content-Type на конечную точку интеграции.

aws apigateway update-integration \
     --rest-api-id a1b2c3d4e5 \
     --resource-id a1b2c3 \
     --http-method POST \
     --patch-operations op='replace',path='/requestParameters/integration.request.header.Content-Type',value='method.request.header.Content-Type'

Пример кода для управления двоичными данными в AWS Gateway и Proxy + Lambda. Или для загрузки и получения файлов с серверов с помощью AWS Gateway и Proxy Lambda + Щелкните здесь

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