2015-11-09 14 views
20

Sto cercando di ottenere la stessa cosa di this post, ma non riesco a capire la risposta e non ho il permesso di chiedere chiarimenti nei commenti.Ritorno HTML dal gateway API AWS

Ho un gateway endpoint API che accetta una richiesta GET, passa attraverso alcune variabili di richiesta alla funzione lambda (implementato in Python), e restituisce text/html tramite un modello di risposta vuota (come descritto here

Come descritto nella domanda precedente SO, se la funzione lambda restituisce una stringa HTML e l'endpoint API utilizza il comportamento predefinito Passthrough uscita @ Integrazione di risposta, l'output HTML è citato:

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

Quella risposta (da @ARUNBALAN NV) dice "Archivia semplicemente il markup HTML in una variabile e restituiscilo." , ma non sono sicuro di cosa ciò significhi nel contesto di una funzione Lambda. Significa restituire una risposta "application/json" con un elemento chiamato "variableHTML"? Qualcosa come questo?

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

ho impostato che fino & nel gateway API mia risposta Integrazione ora utilizza una mappatura per estrarre l'elemento (per 200 applicazioni/risposte JSON) esattamente come suggerito:

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

Il risultato è ora un punto singolo restituito.

Ho provato molte varianti ($ input.json invece di $ input.path, diversi tipi di contenuto in stadi diversi, ecc.), Ma ritengo che la configurazione di cui sopra corrisponda maggiormente alla risposta accettata dall'altro thread.

Qualsiasi comprensione in cui mi sto sbagliando sarà apprezzata. Grazie per aver letto!

risposta

38

Sei molto vicino. La chiave per capire questo è rendersi conto che qualunque oggetto Python restituito verrà serializzato su JSON. Quindi, se si restituisce una stringa, questa verrà quotata e portata a un oggetto JSON valido. Se si desidera che il valore di questa stringa, quindi utilizzare la seguente mappatura Integrazione di risposta:

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

La linea #set$inputRoot il valore di tutta la JSON Il vostro programma Python è tornato ... che è solo la stringa originale che si restituito prima che il framework Lambda lo convertisse in JSON.

Supponiamo di voler creare la risposta nella mappatura, anziché nel programma. Poi, invece di restituire una stringa Python, si potrebbe restituire un oggetto Python, in questo modo:

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

la mappatura potrebbe convertire in HTML in questo modo:

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

Utilizzando una mappatura in questo modo è più utile se stai restituendo dati strutturati rispetto al semplice HTML, però. Userò la prima mappatura sopra per il tuo problema.

+0

Grazie mille, Charles! Funziona perfettamente. –

+1

Questo ha funzionato per me. Come riferimento, ho usato "text/html" come tipo di contenuto del modello di mapping e l'ultimo blocco di codice html ha funzionato alla grande. –

+1

Non dimenticare di fare clic sul pulsante blu e rilascia API !! – scottndecker

3

Quando si utilizza espresso, si può semplicemente impostare l'intestazione in app come:

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

Quando si utilizza aws-serverless-express o simili, queste intestazioni dovrebbero essere propagate.

Problemi correlati