1) Konfigurieren Sie Ihre API-Gateway-Ressource für die Verwendung der Lambda-Proxy-Integration, indem Sie das Kontrollkästchen "Lambda-Proxy-Integration verwenden" im Bildschirm "Integrationsanforderung" der API-Gateway-Ressourcendefinition aktivieren. (Oder definieren Sie es in Ihrer Cloudformation / Terraform / Serverless / etc-Konfiguration)
2) Ändern Sie Ihren Lambda-Code auf zwei Arten
- Verarbeiten Sie den Eingang
event(1. Funktionsargument) entsprechend. Es ist nicht mehr nur die bloße Nutzlast, sondern stellt die gesamte HTTP-Anforderung dar, einschließlich Header, Abfragezeichenfolge und Text. Beispiel unten. Der entscheidende Punkt ist, dass JSON-Körper Zeichenfolgen sind, die einen expliziten JSON.parse(event.body)Aufruf erfordern (vergessen Sie try/catchdas nicht). Beispiel ist unten.
- Respond durch den Rückruf mit null dann eine Antwort Objekt aufrufen , die die HTTP - Details einschließlich bietet
statusCode, bodyund headers.
bodysollte eine Zeichenfolge sein, tun Sie dies JSON.stringify(payload)nach Bedarf
statusCode kann eine Zahl sein
headers ist ein Objekt von Headernamen zu Werten
Beispiel für ein Lambda-Ereignisargument für die Proxy-Integration
{
"resource": "/example-path",
"path": "/example-path",
"httpMethod": "POST",
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"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",
"Content-Type": "application/json",
"Host": "exampleapiid.execute-api.us-west-2.amazonaws.com",
"User-Agent": "insomnia/4.0.12",
"Via": "1.1 9438b4fa578cbce283b48cf092373802.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "oCflC0BzaPQpTF9qVddpN_-v0X57Dnu6oXTbzObgV-uU-PKP5egkFQ==",
"X-Forwarded-For": "73.217.16.234, 216.137.42.129",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"queryStringParameters": {
"bar": "BarValue",
"foo": "FooValue"
},
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"accountId": "666",
"resourceId": "xyz",
"stage": "dev",
"requestId": "5944789f-ce00-11e6-b2a2-dfdbdba4a4ee",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"apiKey": null,
"sourceIp": "73.217.16.234",
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "insomnia/4.0.12",
"user": null
},
"resourcePath": "/example-path",
"httpMethod": "POST",
"apiId": "exampleapiid"
},
"body": "{\n \"foo\": \"FOO\",\n \"bar\": \"BAR\",\n \"baz\": \"BAZ\"\n}\n",
"isBase64Encoded": false
}
Beispiel für eine Rückrufantwortform
callback(null, {
statusCode: 409,
body: JSON.stringify(bodyObject),
headers: {
'Content-Type': 'application/json'
}
})
Anmerkungen
- Ich glaube, die Methoden auf contextsolche context.succeed()sind veraltet. Sie sind nicht mehr dokumentiert, obwohl sie noch zu funktionieren scheinen. Ich denke, dass das Codieren in die Callback-API die richtige Sache für die Zukunft ist.