POST-запрос AWS API Gateway не возвращает выходные данные при отправке изображения в качестве полезной нагрузки - PullRequest
0 голосов
/ 10 декабря 2018

Я потратил много времени, но все еще безуспешно.

Моя цель - отправить изображение в функцию AWS Lambda, выполнить там некоторую обработку изображения и вернуть измененное изображение обратно.используя API Gateway.Итак, проблемная операция для меня:

  1. Отправка данных изображения на сервер Lambda.
  2. Возврат изображения из Lambda.

Я используюPOST API.И поскольку теперь мы можем работать с двоичными данными в API Gateway, я следовал за установочной частью API Gateway из этого официального блога .

Моя функция Lambda выглядит следующим образом:

def lambda_handler(event, context):
    # TODO implement
    image = event['base64Image']
    return {
        "isBase64Encoded": True,
        "statusCode": 200,
        "headers":{
                "content/type": "image/png",
        },
        "body": "any string"
    }

И мой призыв к API-коду Python:

headers = {
    'Accept': 'image/png',
    'Content-Type': 'image/png',
}

data = open('random.jpg', 'rb').read()
response = requests.post(' https://xxxxxxx.execute-api.us-east-1.amazonaws.com/prod', headers=headers, data=data)
print(response.content)

Согласно блогу, в Integration Request я добавил шаблон Mapping image/png, а также шаблон

{
    "base64Image" : "$input.body"
}

И в API> Настройки в Binary Media Type Я добавил image/png.

. То, что происходит сейчас, - я могу правильно получать данные base64 изображения в моем event[base64Image] объекте.

Но полученный ответ не приходит.Как видите, я просто возвращаю простую строку, но получаю ошибку '{"message": "Internal server error"}'.Вместо "any string" в теле result я попытался отправить данные base64 также напрямую, но получил ту же ошибку.

Итак, проблема сводится к тому, как получить результат в POST-запросе при отправке данных изображенияв качестве полезной нагрузки.

Я также следовал этому ответу и соответственно в своем Integration Response я выбрал Convert to Binary (if needed) вариант.Но это также не помогло.

Если я не ошибаюсь, то проблема связана с application/json и image/png, но я перепробовал всю комбинацию перестановок везде, но, похоже, ничего не работает.

Я прилагаю скриншоты настройки API Gateway:

ЗАПРОС ИНТЕГРАЦИИ enter image description here

ОТВЕТ ОБ ИНТЕГРАЦИИ

enter image description here

НАСТРОЙКИ

enter image description here

Лямбда-функция в собственной консоли правильно выдает выходные данные, поэтому моя проблема сейчас сводится к получению любого результата от лямбда-функции с использованием API POST в этой настройке.

Редактировать: Когда я использую запрос GET дляпросто отправьте вывод image-> base64, я могу обойтись без изменений, упомянутых в блоге.Тогда функция Lambda имеет вид:

def lambda_handler(event, context):
    # TODO implement
    return {
        "isBase64Encoded": True,
        "statusCode": 200,
        "headers":{
                "content/type": "image/png",
        },
        "body": base64.b64encode(open('random.jpg','rb').read()).decode('utf-8')
    }

Здесь random.jpg - это изображение, которое находится только в папке Lambda zip.

Исправление: его content-type, а не content/type.(Ошибка все еще там).

1 Ответ

0 голосов
/ 10 декабря 2018

Установите Accept Тип содержимого заголовка application/json, поскольку данные, которые должны быть получены, являются строкой.

В документации четко написано:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...