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 la integración de Lambda , puede personalizar lo que va a pasar a Lambda en la carga útil que no necesita para analizar el cuerpo, pero cuando utiliza la integración de Lambda Proxy en API Gateway, API Gateway enviará todo a Lambda en la carga útil. Me gusta esto,
{
"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 hay que entender 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 un parámetro de ruta o cadena de consulta a AWS Lambda desde Amazon API Gateway
Arquitectura sin servidor en AWS
el cuerpo es una cadena de escape, no JSON
Con Lambda Proxy Integration, el cuerpo en caso de lambda es una cadena de escape con barra invertida, no un JSON.
Si se prueba en un formateador JSON.
El documento a continuación trata sobre la respuesta, pero debería aplicarse a la solicitud.
Para que JavaScript acceda a él como un objeto JSON, es necesario convertirlo nuevamente en un objeto JSON con json.parse en JapaScript, json.dumps en Python.
La documentación de AWS muestra qué hacer.
fuente
Estoy usando lambda con Zappa; Estoy enviando datos con POST en formato json:
Mi código para basic_lambda_pure.py es:
Obtuve la siguiente respuesta json:
mis datos estaban en la clave del cuerpo , pero están codificados en code64, ¿cómo puedo saber esto? Vi la clave isBase64Encoded
Copio el valor de la clave del cuerpo y lo decodifico con Esta herramienta y "eureka", obtengo los valores.
Espero que esto te ayude. :)
fuente