usar from aws amazon-web-services aws-lambda aws-api-gateway

amazon-web-services - from - postman api key authentication



Devolver HTML desde AWS API Gateway (2)

Al usar Express, puede configurar el encabezado en la aplicación como:

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

Cuando se usa aws-serverless-express o similar, esos encabezados deben propagarse.

Estoy tratando de lograr lo mismo que esta publicación , pero no entiendo la respuesta y no tengo permiso para pedir una aclaración en los comentarios.

Tengo un punto final de Pasarela API que acepta una solicitud GET, pasa a través de algunas variables de solicitud a la función Lambda (implementada en Python) y devuelve texto / html a través de un Modelo de respuesta vacío (como se describe here

Como se describió en la pregunta anterior de SO, si la función Lambda devuelve una cadena HTML y el punto final API usa el comportamiento predeterminado de Passthrough Output @ Integration Response, la salida HTML se cita:

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

Esa respuesta (por @ARUNBALAN NV) dice "Simplemente almacene el marcado HTML en una variable y devuélvala", pero no estoy seguro de lo que eso significa en el contexto de una función Lambda. ¿Significa devolver una respuesta "application / json" con un elemento llamado "variableHTML"? ¿Algo como esto?

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

Configuré eso y en API Gateway mi respuesta de integración ahora usa una asignación para extraer el elemento (para 200 respuestas de aplicación / json) exactamente como se sugiere:

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

El resultado ahora es un único punto que se devuelve.

He intentado muchas variaciones ($ input.json en lugar de $ input.path, diferentes tipos de contenido en diferentes etapas, etc.), pero siento que la configuración anterior coincide más estrechamente con la respuesta aceptada del otro hilo.

Cualquier información que me vaya mal con esto será apreciada. ¡Gracias por leer!


Estás muy cerca. La clave para entender esto es darse cuenta de que cualquier objeto de Python que devuelva se serializará en JSON. Por lo tanto, si devuelve una cadena, se citará y se escapará a un objeto JSON válido. Si desea el valor de esta cadena, utilice la siguiente asignación de respuesta de integración:

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

La línea #set da $inputRoot al valor de todo el objeto JSON devuelto por su programa Python ... que es solo la cadena original que devolvió antes de que el framework Lambda lo convirtiera a JSON.

Supongamos que quiere construir la respuesta en el mapeo, en lugar de en su programa. Entonces, en lugar de devolver una cadena de Python, puede devolver un objeto de Python, como ese:

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

Su mapeo podría convertir eso a HTML así:

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

Sin embargo, usar una asignación de esa manera es más útil si devuelve datos estructurados que el simple HTML. Utilizaría la primera asignación anterior para su problema.