2015-11-09 10 views
20

Próbuję osiągnąć to samo, co this post, ale nie rozumiem odpowiedzi tam i nie mam uprawnień, aby prosić o wyjaśnienia w komentarzach.Powróć HTML z bramy AWS API

mam API bramy końcowy, który akceptuje żądania GET, przechodzący przez niektórych zmiennych żądanie do funkcji lambda (realizowanego w Pythonie) i zwraca text/html poprzez Pusty model Response (jak opisano here

jako opisane we wcześniejszym SO pytanie, czy funkcja lambda zwraca ciąg HTML i punktem końcowym API używa domyślnego wyjścia przekazujące zachowanie @ Integracji Response, wyjście HTML jest cytowany:

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

to odpowiedź (przez @ARUNBALAN NV) mówi "Po prostu przechowuj znaczniki HTML w zmiennej i zwróć ją." , ale nie jestem pewien, co to oznacza w kontekście funkcji Lambda. Czy oznacza to zwrócenie odpowiedzi "application/json" z elementem o nazwie "variableHTML"? Coś takiego?

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

ustawić, że się & w API bramy mój Integracja Response teraz wykorzystuje mapowanie wyodrębnić element (do 200 aplikacji/odpowiedzi json) dokładnie jak sugeruje:

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

Rezultatem jest teraz pojedyncza kropka jest zwracana.

Próbowałem wielu odmian ($ input.json zamiast $ input.path, różne typy zawartości na różnych etapach itd.), Ale czuję, że powyższe ustawienia najbardziej pasują do zaakceptowanej odpowiedzi z innego wątku.

Dowolny wgląd w to, co robię źle, zostanie doceniony. Dziękuje za przeczytanie!

Odpowiedz

38

Jesteś bardzo blisko. Kluczem do zrozumienia tego jest świadomość, że każdy zwracany obiekt Pythona będzie serializowany do JSON. Tak więc, jeśli zwrócisz łańcuch znaków, zostanie on zacytowany i zmieniony na poprawny obiekt JSON. Jeśli chcesz, aby wartość tego ciągu, a następnie kliknąć na poniższy odwzorowanie Integracja Response:

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

Linia #set daje $inputRoot wartość całego obiektu JSON program Python wrócił ... co jest tylko oryginalny ciąg zwrócone zanim framework Lambda przekonwertował go do JSON.

Załóżmy, że chcesz zbudować odpowiedź w mapowaniu zamiast w swoim programie. Wtedy, zamiast wrócić ciąg Python, można zwrócić obiekt Pythona, tak jak:

return {"title": "Greeting", "message": "Hello"} 

Twój mapowania mógł przekonwertować do formatu HTML tak:

#set($inputRoot = $input.path('$')) 
<html><head><title>$inputRoot.title</title></head> 
<body>$inputRoot.message</body></html> 

Korzystanie z mapowania, że ​​sposób jest bardziej przydatne, jeśli zwracasz dane strukturalne niż zwykły HTML. Używałbym pierwszego odwzorowania powyżej dla twojego problemu.

+0

Wielkie dzięki, Charles! Działa świetnie. –

+1

To zadziałało dla mnie. Dla porównania użyłem "text/html" jako typu zawartości szablonu mapowania, a ostatni blok kodu HTML działał świetnie. –

+1

Nie zapomnij kliknąć niebieskiego przycisku i wdrożyć interfejs API !! – scottndecker

3

Podczas korzystania Express, można po prostu ustawić nagłówek w aplikacji jak:

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

Podczas korzystania aws-serverless-express lub podobne, te nagłówki powinny być propagowane.

Powiązane problemy