2015-11-09 8 views
20

Ich versuche, die gleichen wie this post zu erreichen, aber ich verstehe nicht, die Antwort gibt und nicht über die Berechtigung zur Klärung in den Kommentaren zu fragen.Return HTML von AWS API-Gateway

Ich habe einen API-Gateway-Endpunkt, der eine GET-Anforderung akzeptiert, geht durch einige Anforderungsvariablen auf die Lambda-Funktion (ausgeführt in Python) und gibt text/html über ein leeres Antwortmodell (wie here beschrieben

Wie in der früheren SO Frage beschrieben, wenn die Lambda-Funktion, um einen HTML-String und der API-Endpunkt verwendet das Standard-Output Pass-Through Verhalten @ Integration Antwort zurückgibt, wird die HTML-Ausgabe zitiert:

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

Diese Antwort (von @ARUNBALAN NV) sagt "Einfach das HTML-Markup in einer Variablen speichern und zurückgeben." , aber ich bin nicht sicher, was das im Zusammenhang mit einer Lambda-Funktion bedeutet. Bedeutet es, eine "application/json" -Antwort mit einem Element namens "variableHTML" zurückzugeben? Etwas wie das?

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

ich festgelegt, dass bis & in API-Gateway jetzt meine Integration Response hat ein Mapping verwendet das Element (200 application/json Antworten) genau wie vorgeschlagen zu extrahieren:

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

Das Ergebnis ist nun ein einzelner Punkt wird zurückgegeben.

Ich habe versucht, viele Variationen ($ input.json anstelle von $ input.path, verschiedene Inhaltstypen in verschiedenen Stadien, etc.), aber fühle mich die obige Einstellung am besten entspricht die angenommene Antwort aus dem anderen Thread.

Einsicht wo ich mit diesem falschen werde wird geschätzt. Danke fürs Lesen!

Antwort

38

Sie sind ganz in der Nähe. Der Schlüssel dies zu verstehen, ist zu erkennen, dass alles, was Python Objekt, das Sie JSON wird serialisiert zurückzukehren. Also, wenn Sie einen String zurückgeben, wird sie zitiert und flüchtete zu einem gültigen JSON-Objekt. Wenn Sie den Wert dieser Zeichenfolge wollen, dann verwenden Sie die folgende Integration Response-Mapping:

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

Die #set Linie gibt $inputRoot den Wert des gesamten JSON Ihr Python-Programm-Objekt zurückgegeben ... was Sie gerade die ursprüngliche Zeichenfolge zurückgegeben, bevor das Lambda-Framework es in JSON konvertiert hat.

Angenommen, Sie möchten die Antwort im Mapping erstellen, anstatt in Ihrem Programm. Dann anstelle eines Python-String zurückkehrt, könnten Sie ein Python-Objekt zurückgeben, etwa so:

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

Ihre Mapping, dass in HTML umwandeln könnte etwa so:

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

ein Mapping auf diese Weise mehr nützlich, wenn Sie strukturierte Daten als einfaches HTML zurückgeben. Ich würde die erste Abbildung oben für Ihr Problem verwenden.

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

Wenn aws-serverless-express oder ähnliches verwenden, sollten diese Header propagiert werden:

+0

Vielen Dank, Charles! Funktioniert perfekt. –

+1

Das hat für mich funktioniert. Als Referenz habe ich 'text/html' als Mapping Template-Inhaltstyp verwendet und der letzte HTML-Code-Block hat super funktioniert. –

+1

Vergessen Sie nicht, auf die blaue Schaltfläche und Deploy API zu klicken !! – scottndecker

3

Wenn Express verwenden, können Sie den Header in der App wie gesetzt gerade.