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.
Например, когда кто-то хочет отправить:
- Имя пользователя (строка)
- Аватар (изображение)
Аватар должен быть закодирован с 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 + Щелкните здесь