Я потратил много времени, но все еще безуспешно.
Моя цель - отправить изображение в функцию AWS Lambda, выполнить там некоторую обработку изображения и вернуть измененное изображение обратно.используя API Gateway
.Итак, проблемная операция для меня:
- Отправка данных изображения на сервер Lambda.
- Возврат изображения из 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:
ЗАПРОС ИНТЕГРАЦИИ
ОТВЕТ ОБ ИНТЕГРАЦИИ
НАСТРОЙКИ
Лямбда-функция в собственной консоли правильно выдает выходные данные, поэтому моя проблема сейчас сводится к получению любого результата от лямбда-функции с использованием 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
.(Ошибка все еще там).