Возврат HTML из AWS API Gateway
Я пытаюсь достичь того же, что этот пост, но я не понимаю ответа там и не имею разрешения просить разъяснений в комментариях.
У меня есть конечная точка шлюза API, которая принимает запрос GET, передает через некоторые переменные запроса функцию Lambda (реализованную на Python) и возвращает текст /html через пустую модель ответа (как описано здесь
Как описано в предыдущем вопросе SO, если функция Lambda возвращает строку HTML, а конечная точка API использует поведение по умолчанию Output Passthrough @Integration Response, вывод HTML цитируется:
"\n<html>\n<body>\n ... \n</body>\n</html>\n"
Этот ответ (by @ARUNBALAN NV) говорит: "Просто сохраните разметку HTML в переменной и верните ее". Но я не уверен, что это означает в контексте функции лямбда. Означает ли это, что ответ "application/json" возвращает элемент с именем "variableHTML"? Что-то вроде этого?
"{\"variableHTML\": \"\\n<html>\\n<body>\\n ... \\n</body>\\n</html>\\n\"}"
Я установил это, и в API-шлюзе my Integration Response теперь использует Mapping для извлечения элемента (для 200 приложений/json-ответов) точно так же, как предлагалось:
#set($inputRoot = $input.path('$'))
$inputRoot.variableHTML .
В результате теперь возвращается одна точка.
Я пробовал много вариантов ($ input.json вместо $input.path, разных типов контента на разных этапах и т.д.), но чувствую, что приведенная выше настройка наиболее точно соответствует принятому ответу из другого потока.
Любое понимание, в котором я ошибаюсь, будет оценено по достоинству. Спасибо за чтение!
Ответы
Ответ 1
Ты очень близко. Ключом к пониманию этого является понимание того, что любой объект Python, который вы вернете, будет сериализован для JSON. Итак, если вы вернете строку, она будет процитирована и экранирована до действительного объекта JSON. Если вы хотите получить значение этой строки, используйте следующее сопоставление отклика интеграции:
#set($inputRoot = $input.path('$'))
$inputRoot
Строка #set
дает $inputRoot
значение всего объекта JSON, на который была возвращена ваша программа Python... которая является только исходной строкой, которую вы вернули до того, как структура Lambda превратила ее в JSON.
Предположим, вы хотели создать ответ в сопоставлении, а не в своей программе. Затем вместо того, чтобы возвращать строку Python, вы можете вернуть объект Python, например:
return {"title": "Greeting", "message": "Hello"}
Ваше сопоставление может преобразовать это в HTML следующим образом:
#set($inputRoot = $input.path('$'))
<html><head><title>$inputRoot.title</title></head>
<body>$inputRoot.message</body></html>
Использование сопоставления в этом случае более полезно, если вы возвращаете структурированные данные, чем простой HTML. Я бы использовал первое сопоставление, указанное выше для вашей проблемы.
Ответ 2
При использовании функции express вы можете просто установить заголовок в приложении, например:
res.set('Content-Type', 'text/html');
При использовании aws-serverless-express
или подобных, эти заголовки должны распространяться.