Saltar al contenido

Obtener json body en aws Lambda a través de API gateway

El paso a paso o código que encontrarás en este artículo es la solución más sencilla y válida que encontramos a esta inquietud o problema.

Solución:

Hay dos integraciones de Lambda diferentes que puede configurar en API Gateway, como la integración de Lambda y la integración de proxy de Lambda. Para Integración lambda, puede personalizar lo que va a pasar a Lambda en la carga útil que no necesita analizar el cuerpo, pero cuando está utilizando Integración de Lambda Proxy en API Gateway, API Gateway enviará todo a Lambda en una carga útil como esta,


    "message": "Hello me!",
    "input": 
        "path": "/test/hello",
        "headers": 
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
            "Accept-Language": "en-US,en;q=0.8",
            "CloudFront-Forwarded-Proto": "https",
            "CloudFront-Is-Desktop-Viewer": "true",
            "CloudFront-Is-Mobile-Viewer": "false",
            "CloudFront-Is-SmartTV-Viewer": "false",
            "CloudFront-Is-Tablet-Viewer": "false",
            "CloudFront-Viewer-Country": "US",
            "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
            "Upgrade-Insecure-Requests": "1",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
            "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
            "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
            "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
            "X-Forwarded-Port": "443",
            "X-Forwarded-Proto": "https"
        ,
        "pathParameters": "proxy": "hello",
        "requestContext": 
            "accountId": "123456789012",
            "resourceId": "us4z18",
            "stage": "test",
            "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
            "identity": 
                "cognitoIdentityPoolId": "",
                "accountId": "",
                "cognitoIdentityId": "",
                "caller": "",
                "apiKey": "",
                "sourceIp": "192.168.100.1",
                "cognitoAuthenticationType": "",
                "cognitoAuthenticationProvider": "",
                "userArn": "",
                "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
                "user": ""
            ,
            "resourcePath": "/proxy+",
            "httpMethod": "GET",
            "apiId": "wt6mne2s9k"
        ,
        "resource": "/proxy+",
        "httpMethod": "GET",
        "queryStringParameters": "name": "me",
        "stageVariables": "stageVarName": "stageVarValue",
        "body": ""foo":"bar"",
        "isBase64Encoded": false
    

Para el ejemplo al que hace referencia, no obtiene el cuerpo de la solicitud original. Está construyendo el cuerpo de respuesta a API Gateway. Debería estar en este formato,


    "statusCode": httpStatusCode,
    "headers":  "headerName": "headerValue", ... ,
    "body": "...",
    "isBase64Encoded": false

Creo que hay algunas cosas que se deben comprender al trabajar con la integración de API Gateway con Lambda.

Integración Lambda vs Integración Lambda Proxy

Solía ​​haber solo Integración Lambda que requiere plantillas de mapeo. Supongo que es por eso que todavía veo muchos ejemplos usándolo.

  • Cómo pasar una cadena de consulta o un parámetro de ruta a AWS Lambda desde Amazon API Gateway

A partir de septiembre de 2017, ya no es necesario configurar asignaciones para acceder al cuerpo de la solicitud.

Integración de proxy de Lambda: si la habilita, API Gateway asignará cada solicitud a JSON y la pasará a Lambda como el objeto de evento. En la función Lambda podrá recuperar consultas string parámetros, encabezados, variables de etapa, parámetros de ruta, contexto de solicitud y el cuerpo del mismo.

Sin habilitar Lambda Proxy Integration, tendrá que crear una plantilla de mapeo en la sección Solicitud de integración de API Gateway y decidir cómo mapear la solicitud HTTP a JSON usted mismo. Y probablemente tendría que crear un mapeo de respuesta de integración si tuviera que devolver la información al cliente.

Antes de que se agregara la integración de proxy de Lambda, Los usuarios se vieron obligados a mapear solicitudes y respuestas manualmente, lo que fue una fuente de consternación., especialmente con mapeos más complejos.

Las palabras necesitan navegar por el pensamiento. Para aclarar la terminología.

  • Integración de proxy Lambda = Transferencia
    Simplemente pase la solicitud HTTP a lambda.

  • Integración de Lambda = Transformación de plantilla
    Realice un proceso de transformación utilizando la plantilla Apache Velocity y debe escribir la plantilla usted mismo.

el cuerpo se escapó string, no JSON

Con la integración de proxy de Lambda, el cuerpo en caso de lambda es un string escapó con barra invertida, no un JSON.

"body": ""foo":"bar"" 

Si se prueba en un formateador JSON.

Parse error on line 1:
"foo":"bar"
-^
Expecting 'STRING', '}', got 'undefined'

El documento a continuación trata sobre la respuesta, pero debería aplicarse a la solicitud.

El campo del cuerpo, si devuelve JSON, debe convertirse en un string o causará más problemas con la respuesta. Puede usar JSON.stringify para manejar esto en las funciones de Node.js; otros tiempos de ejecución requerirán soluciones diferentes, pero el concepto es el mismo.

Para que JavaScript acceda a él como un objeto JSON, debe convertirlo nuevamente en un objeto JSON con json.parse en JapaScript, json.dumps en Python.

  • Cómo trabajar con JSON en JavaScript

Las cadenas son útiles para transportar, pero querrás poder convertirlos de nuevo en un objeto JSON en el lado del cliente y / o del servidor.

La documentación de AWS muestra qué hacer.

if (event.body !== null && event.body !== undefined) 
    let body = JSON.parse(event.body)
    if (body.time) 
        time = body.time;

...
var response = 
    statusCode: responseCode,
    headers: 
        "x-custom-header" : "my custom header value"
    ,
    body: JSON.stringify(responseBody)
;
console.log("response: " + JSON.stringify(response))
callback(null, response);

Te invitamos a añadir valor a nuestra información contribuyendo tu experiencia en los comentarios.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *