Возврат 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 или подобных, эти заголовки должны распространяться.