Es gibt zwei verschiedene Lambda-Integrationen, die Sie in API Gateway konfigurieren können, z. B. die Lambda-Integration und die Lambda-Proxy-Integration. Für die Lambda-Integration können Sie anpassen, was an Lambda in der Nutzlast übergeben werden soll, die Sie nicht zum Analysieren des Körpers benötigen. Wenn Sie jedoch die Lambda-Proxy-Integration in API Gateway verwenden, wird API Gateway alles in Nutzlast an Lambda weiterleiten so was,
{
"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
}
}
In dem Beispiel, auf das Sie verweisen, wird der Text nicht aus der ursprünglichen Anforderung abgerufen. Es erstellt den Antworttext zurück zum API-Gateway. Es sollte in diesem Format sein,
{
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "...",
"isBase64Encoded": false
}
Ich denke, es gibt ein paar Dinge zu verstehen, wenn Sie mit der API-Gateway-Integration mit Lambda arbeiten.
Lambda-Integration vs Lambda-Proxy-Integration
Früher gab es nur die Lambda-Integration, für die Mapping-Vorlagen erforderlich sind. Ich nehme an, deshalb sehen wir immer noch viele Beispiele, die es verwenden.
So übergeben Sie einen Querystring- oder Routenparameter vom Amazon API Gateway an AWS Lambda
Serverlose Architektur unter AWS
body ist ein Escape-String, nicht JSON
Bei Verwendung der Lambda-Proxy-Integration ist der Body bei Lambda eine Zeichenfolge, die mit einem Backslash maskiert ist, kein JSON.
Wenn in einem JSON-Formatierer getestet.
Das folgende Dokument befasst sich mit der Antwort, sollte jedoch für Anfragen gelten.
Damit JavaScript als JSON-Objekt darauf zugreifen kann, muss es mit json.parse in JapaScript und json.dumps in Python wieder in ein JSON-Objekt konvertiert werden.
Die AWS-Dokumentation zeigt, was zu tun ist.
quelle
Ich benutze Lambda mit Zappa; Ich sende Daten mit POST im JSON-Format:
Mein Code für basic_lambda_pure.py lautet:
Ich habe die nächste Antwort von json erhalten:
Meine Daten befanden sich auf dem Body- Key, sind jedoch mit Code64 codiert. Woher weiß ich das? Ich habe gesehen, dass der Schlüssel Base64Encoded ist
Ich kopiere den Wert für den Body Key und dekodiere mit diesem Tool und "eureka", ich erhalte die Werte.
Ich hoffe das hilft dir. :) :)
quelle