В API Gateway можно настроить две разные интеграции Lambda, например интеграцию Lambda и интеграцию прокси-сервера Lambda. Для интеграции Lambda вы можете настроить то, что вы собираетесь передать Lambda в полезной нагрузке, которая вам не нужна для синтаксического анализа тела, но когда вы используете интеграцию Lambda Proxy в API Gateway, API Gateway будет проксировать все в Lambda в полезной нагрузке. как это,
{
"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
}
}
Для примера, на который вы ссылаетесь, он не получает тело из исходного запроса. Он создает тело ответа обратно в API Gateway. Он должен быть в таком формате,
{
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "...",
"isBase64Encoded": false
}
Я думаю, что при работе с интеграцией API Gateway с Lambda необходимо понимать несколько вещей.
Лямбда-интеграция против интеграции с лямбда-прокси
Раньше была только лямбда-интеграция, для которой требовались шаблоны отображения. Полагаю, поэтому до сих пор вижу много примеров с его использованием.
Как передать строку запроса или параметр маршрута в AWS Lambda из Amazon API Gateway
Бессерверная архитектура на AWS
тело - это экранированная строка, а не JSON
При использовании интеграции лямбда-прокси тело в случае лямбда-выражения представляет собой строку, экранированную обратной косой чертой, а не JSON.
Если проверено в форматировщике JSON.
Документ ниже касается ответа, но он должен применяться к запросу.
Чтобы JavaScript мог получить доступ к нему как к объекту JSON, необходимо преобразовать его обратно в объект JSON с помощью json.parse в JapaScript, json.dumps в Python.
В документации AWS показано, что делать.
источник
Я использую лямбду с Заппой; Я отправляю данные с помощью POST в формате json:
Мой код для basic_lambda_pure.py:
Я получил следующий ответ json:
мои данные были на теле ключа, но code64 кодированный, Как я могу это знать? Я видел ключBase64Encoded
Я копирую значение для основного ключа и декодирую с помощью этого инструмента и «эврики», я получаю значения.
Надеюсь, это вам поможет. :)
источник
Возможно, вы забыли определить
Content-Type
заголовок. Например:источник