2015-08-17 13 views
26

W tym pytaniu How to pass a querystring or route parameter to AWS Lambda from Amazon API GatewayJak przekazać params z POST do AWS Lambda z Amazon API Brama

pokazuje jak mapować params ciąg kwerendy do AWS lambda za pomocą bramy API. Chciałbym zrobić to samo, ale odwzorowanie wartości POST zamiast ciągu zapytania. Próbowałem:

{ 
    "values": "$input.params()" 
} 

ale nie działa, nie widzę rzeczywistych danych formularza. BTW jestem delegowania przy użyciu:

application/x-www-form-urlencoded

dostanę odpowiedź z mojej funkcji lambda, więc wiem, że to jest wywoływanie lambda w porządku, ale moim problemem jest to, że nie widzę params POST wszędzie. Mogę; t wymyślić, jak je zmapować. I zrzucić wszystko mam na stronie Lambda i tutaj jest:

{"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}}"} 
+0

Spójrz na tym kursie, wierzę, że to pomoże - https://snowulf.com/2015/08/05/tutorial-aws-api -gateway-to-lambda-to-dynamodb/ – Stefan

Odpowiedz

20

można konwertować dane żądanie ciało w prawidłowym formacie JSON przez skonfigurowanie szablonów mapowych w ustawieniach integracyjnych tak, że AWS Lambda może otrzymać.

Obecnie wygląda na to, że Amazon API Gateway nie obsługuje jeszcze oficjalnej aplikacji/x-www-form-urlencoded, ale avilewin opublikował a solution, aby to zrobić na forach AWS. W szablonach mapowania można użyć Velocity Template Language (VTL), więc należy skonfigurować szablony odwzorowań, które konwertują format formularza/x-www-form-urlencoded na prawidłowy format JSON. Oczywiście to jest brudne rozwiązanie, ale myślę, że to jedyny sposób, aby to zrobić na razie.

7

można przekonwertować params do JSON z szablonem bramy API: https://forums.aws.amazon.com/thread.jspa?messageID=673012&tstart=0#673012

Albo można zrobić to w samej funkcji lambda za pomocą QueryString parser pacakge: https://www.npmjs.com/package/qs

var qs = require('qs'); 
var obj = qs.parse('a=c'); // { a: 'c' } 

Jeśli Amazon dodaje wbudowany - w obsłudze takiej funkcji będę to wykorzystywał, ale do tej pory osobiście wolę drugą drogę, ponieważ jest czystsza i łatwiejsza do debugowania, jeśli coś pójdzie nie tak.

Aktualizacja lipiec 2017:

integrację można używać proxy, który wspiera go domyślnie: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

35

dobra odpowiedź przez r7kamura.Dodatkowo Oto przykład zrozumiały i solidnej szablon mapowania dla application/x-www-form-urlencoded który działa we wszystkich przypadkach (POST zakładając):

{ 
    "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 
    } 
} 

Byłoby przekształcić wejście

name=Marcus&email=email%40example.com&message= 

do

{ 
    "data": { 
       "name": "Marcus", 
       "email": "[email protected]", 
       "message": "" 
    } 
} 

Program obsługi Lambda może go używać w ten sposób (ten zwraca wszystkie dane wejściowe):

module.exports.handler = function(event, context, cb) { 
    return cb(null, { 
    data: event.data 
    }); 
}; 
+3

Człowieku, nie ma nawet jednego przegłosowania, to działa pięknie dla mnie, dzięki! – ObjectiveTruth

+1

działało idealnie. Wyciągnąłem włosy w ciągu ostatnich kilku dni, próbując załadować facebookową aplikację canvas za pomocą aws. Dobra robota @Marcus –

+0

Witam! Próbuję użyć tego rozwiązania dla i C# Dot.Net Core Lambda integretion jak dotąd mapowanie pozwala na przekazanie żądania do lambda. Ale moje Ciało jest zawsze puste. Próbowałem już zbudować model, który pasuje do parametru formularza, ale bez skutku. Jeśli ktokolwiek skorzysta z tego rozwiązania za pomocą C# jakiejkolwiek pomocy, będzie to apreciation. – Lorien

1

Jeśli włączysz Lambda Integracja Proxy enter image description here

Ciało POST będzie dostępny od:

event['body']['param'] 

parametry GET i nagłówki będą również dostępne poprzez

event['pathParameters']['param1'] 
event["queryStringParameters"]['queryparam1'] 
event['requestContext']['identity']['userAgent'] 
event['requestContext']['identity']['sourceIP'] 
0

Integracja Zapytanie/ciała Mapowanie Szablony

#set($inputRoot = $input.path('$')) 
{ 
    "data": "$inputRoot.data" 
} 

jeśli wyślesz np { "data": "Hello Stac koverflow! " }

można użyć event.data w lambda

Powiązane problemy