Подтвердить что ты не робот

Как передать параметры из 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}}"}
4b9b3361

Ответ 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