2015-11-09 4 views
20

Я пытаюсь достичь того же, что и this post, но я не понимаю ответа там и не имею разрешения просить разъяснений в комментариях.Обратный код HTML AWS API Gateway

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

As описанный в предыдущем SO вопрос, если функция Lambda возвращает строку HTML и API конечных точек используется по умолчанию Output Транзитная пересылка поведение @ Integration Response, выход HTML котируется:

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

Этот ответ (по @ARUNBALAN NV) говорит: «Просто сохраните разметку HTML в переменной и верните ее». , но я не уверен, что это означает в контексте лямбда-функции. Означает ли это, что ответ «application/json» возвращает элемент с именем «variableHTML»? Что-то вроде этого?

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

Я установил, что до & в API шлюзе мой Integration Response теперь использует Mapping для извлечения элемента (для 200 приложений ответов/JSON) точно так, как предложил:

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

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

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

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

ответ

38

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

#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. Я бы использовал первое сопоставление для вашей проблемы.

+0

Большое спасибо, Чарльз! Работает отлично. –

+1

Это сработало для меня. Для справки я использовал «text/html» в качестве типа содержимого шаблона сопоставления, а последний блок кода html работал отлично. –

+1

Не забудьте нажать синюю кнопку и развернуть API! – scottndecker

3

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

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

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