Как передать параметры из POST в AWS Lambda из Amazon API Gateway
В этом вопросе Как передать параметр запроса или маршрута в AWS Lambda из шлюза API Amazon
показывает, как сопоставить параметры строки запроса с AWS lambda с использованием шлюза API. Я хотел бы сделать то же самое, но отображать значения POST вместо строки запроса. Я пробовал:
{
"values": "$input.params()"
}
но не работал, я не вижу фактические данные формы. BTW Я публикую с помощью:
application/x-www-form-urlencoded
Я получаю свой ответ от своей лямбда-функции, поэтому я знаю, что она вызывает lambda fine, но моя проблема в том, что я не вижу параметров POST в любом месте. Я не могу понять, как их сопоставить. Я сбрасываю все, что попадаю на Лямбду, и вот оно:
{"values":"{path={}, querystring={}, header={Accept=*/*, Accept-Encoding=gzip, deflate, Accept-Language=en-US,en;q=0.8, Cache-Control=no-cache, 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/x-www-form-urlencoded, Origin=chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop, Postman-Token=7ba28698-8753-fcb1-1f48-66750ce12ade, Via=1.1 6ba5553fa41dafcdc0e74d152f3a7a75.cloudfront.net (CloudFront), X-Amz-Cf-Id=sc8C7dLcW0BHYopztNYrnddC0hXyFdBzHv0O9aWU1gKhd1D_J2HF3w==, X-Forwarded-For=50.196.93.57, 54.239.140.62, X-Forwarded-Port=443, X-Forwarded-Proto=https}}"}
Ответы
Ответ 1
Хороший ответ r7kamura. Дополнительно Здесь приведен пример понятного и надежного шаблона сопоставления для application/x-www-form-urlencoded
, который работает для всех случаев (при условии POST):
{
"data": {
#foreach( $token in $input.path('$').split('&') )
#set( $keyVal = $token.split('=') )
#set( $keyValSize = $keyVal.size() )
#if( $keyValSize >= 1 )
#set( $key = $util.urlDecode($keyVal[0]) )
#if( $keyValSize >= 2 )
#set( $val = $util.urlDecode($keyVal[1]) )
#else
#set( $val = '' )
#end
"$key": "$val"#if($foreach.hasNext),#end
#end
#end
}
}
Он преобразует вход
name=Marcus&email=email%40example.com&message=
в
{
"data": {
"name": "Marcus",
"email": "[email protected]",
"message": ""
}
}
Обработчик Lambda может использовать его так (этот возвращает все входные данные):
module.exports.handler = function(event, context, cb) {
return cb(null, {
data: event.data
});
};
Ответ 2
Вы можете преобразовать любые данные тела запроса в действительный формат JSON, настроив шаблоны сопоставления в настройках интеграции, чтобы AWS Lambda мог его получить.
В настоящее время кажется, что Amazon API Gateway официально не поддерживает приложение /x -www-form-urlencoded, но avilewin опубликовал решение для этого на форумах AWS, В шаблонах сопоставления вы можете использовать Язык шаблонов скорости (VTL), поэтому вам нужно настроить шаблоны сопоставления, которые преобразуют приложение /x -www-form-urlencoded формат в действительный формат JSON. Конечно, это грязное решение, но я думаю, что это единственный способ сделать это сейчас.
Ответ 3
Вы можете преобразовать params в JSON с шаблоном шлюза API:
https://forums.aws.amazon.com/thread.jspa?messageID=673012&tstart=0#673012
Или вы можете сделать это в самой лямбда-функции с помощью парсера QueryString pacakge: https://www.npmjs.com/package/qs
var qs = require('qs');
var obj = qs.parse('a=c'); // { a: 'c' }
Если Amazon добавит встроенную поддержку такой функции, я буду использовать ее, но до тех пор я лично предпочитаю второй способ, потому что он чище и проще отлаживать, если что-то пойдет не так.
Обновление июля 2017 года:
Вы можете использовать прокси-интеграцию, которая поддерживает ее по умолчанию:
http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html
Ответ 4
Если вы включите Lambda Proxy Integration
![введите описание изображения здесь]()
Тело POST будет доступно из:
event['body']['param']
Параметры и заголовки GET также будут доступны через
event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
Ответ 5
Это работает с интеграцией лямбда.
Предполагая, что ваш орган запроса POST является, например,
{
"name" : "Hello",
"address" : "Cool place"
}
Вы можете получить к нему доступ так:
if (event.body !== null && event.body !== undefined) {
let body = JSON.parse(event.body)
let name = body.name;
let address = body.address;
}
Дополнительная информация здесь: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html
Ответ 6
Шаблоны интеграции/шаблонов сопоставления тела
#set($inputRoot = $input.path('$'))
{
"data": "$inputRoot.data"
}
если вы отправите, например { "data": "Hello Stackoverflow!" }
вы можете использовать event.data в своем lambda