Возвращают HTML-код от шлюза в AWS API-интерфейс


Я пытаюсь добиться того же, что и этот пост, но я не понимаю ответа там и не имею разрешения просить разъяснений в комментариях.

У меня есть конечная точка шлюза API, которая принимает запрос GET, передает некоторые переменные запроса в функцию Lambda (реализованную в Python) и возвращает текст / html через пустую модель ответа (как описано здесь

Как описано в предыдущем вопросе SO, если лямбда-функция возвращает HTML-строка и конечная точка API использует стандартный вывод Passthrough behavior @ Integration Response, вывод HTML заключен в кавычки:

"n<html>n<body>n ... n</body>n</html>n"

Этот ответ (от @ARUNBALAN NV) гласит: "просто сохраните разметку HTML в переменной и верните ее.", но я не уверен, что это означает в контексте лямбда-функции. Это значит, чтобы вернуть "приложение/JSON" ответ с элементом под названием "variableHTML"? Что-то вроде этого?

"{"variableHTML": "\n<html>\n<body>\n ... \n</body>\n</html>\n"}"

Я настроил это & в API Gateway моя интеграция Теперь Response использует отображение для извлечения элемента (для 200 ответов application/json) точно так, как было предложено:

#set($inputRoot = $input.path('$')) 
$inputRoot.variableHTML .

В результате теперь возвращается одна точка.

Я перепробовал много вариантов ($input.json вместо $input.путь, различные типы контента на разных этапах и т. д.), Но чувствую, что вышеописанная настройка наиболее точно соответствует принятому ответу из другого потока.

Любое понимание того, где я ошибаюсь в этом, будет оценено по достоинству. Спасибо за чтение!
2 20

2 ответа:

Вы очень близки. Ключом к пониманию этого является понимание того, что любой возвращаемый объект Python будет сериализован в JSON. Таким образом, если вы возвращаете строку, она будет заключена в кавычки и экранирована в допустимый объект JSON. Если вам нужно значение этой строки, то используйте следующее сопоставление ответов интеграции:

#set($inputRoot = $input.path('$')) 
$inputRoot

Строка #set дает $inputRoot значение всего объекта JSON, возвращенного программой Python... это всего лишь исходная строка, которую вы вернули до лямбда-фреймворка преобразовал его в 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. Я бы использовал первое отображение выше для вашей проблемы.

При использовании express, вы можете просто установить заголовок в приложении, как:

res.set('Content-Type', 'text/html');

При использовании aws-serverless-express или аналогичного, эти заголовки должны быть распространены.