Это потому, что при тестировании с консоли AWS Lambda вы отправляете JSON, который вы на самом деле ожидаете. Но когда это вызывается из API Gateway, событие выглядит иначе.
Вам понадобится получить доступ к объекту event.body
, чтобы получить JSON, однако тело представляет собой Stringified JSON, то есть вам придется сначала его проанализировать.
Вы не указали, на каком языке вы кодируете, но если вы используете NodeJS, вы можете разобрать тело следующим образом:
JSON.parse(event.body)
.
Если вы используете Python, вы можете сделать это:
json.loads(event["body"])
Если вы используете любой другой язык, я предлагаю вам посмотреть, как анализировать JSON из заданной строки
Это дает то, что вам нужно.
Вот как выглядит событие из API Gateway:
{
"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": "'{\"user-id\":\"123\",\"name\":\"name\", \"firstname\":\"firstname\"}'"
}
EDIT
После дальнейшего обсуждения в комментариях еще одна проблема заключается в том, что вы используете API-интерфейс DynamoDB, а не API-интерфейс DocumentClient. При использовании API DynamoDB вы должны указать типы ваших объектов. С другой стороны, DocumentClient устраняет эту сложность.
Я также немного реорганизовал ваш код (в настоящее время только для простоты), поэтому вы можете использовать async / await
'use strict';
console.log('Function Prep');
const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event) => {
switch (event.httpMethod) {
case 'POST':
await dynamo.put({TableName: 'users', Item: JSON.parse(event.body)}).promise();
break;
default:
throw new Error(`Unsupported method "${event.httpMethod}"`);
}
return {
statusCode: 200,
body: JSON.stringify({message: 'Success'})
}
};
Вот элемент в DynamoDB:
А это мой запрос почтальона:
С правильными заголовками:
При создании API Gateway я установил флажок Use Lambda Proxy integration
. Мой API выглядит так:
Если вы воспроизводите эти шаги, это должно сработать.