2015-08-17 5 views
26

In dieser Frage zu übergeben How to pass a querystring or route parameter to AWS Lambda from Amazon API GatewayWie ein params von POST zu AWS Lambda von Amazon-API-Gateway

zeigt, wie Query-String-params AWS Lambda zur Karte API-Gateway. Ich möchte das selbe machen, aber POST-Werte anstelle von Abfragezeichenfolgen zuordnen. Ich habe versucht:

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

aber nicht funktioniert, sehe ich nicht die tatsächlichen Formulardaten. BTW bin Entsendung ich mit:

application/x-www-form-urlencoded

ich meine Antwort aus meiner Lambda-Funktion, so dass ich weiß, dass es Lambda fein aufruft, aber mein Problem ist, dass ich nicht den POST params überall sehen. Ich kann nicht herausfinden, wie man sie abbildet. Ich Dump alles, was ich auf Lambda Seite zu bekommen und hier ist es:

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

in diesem Tutorial Schauen Sie, ich glaube, es wird dazu beitragen, - https://snowulf.com/2015/08/05/tutorial-aws-api -gateway-to-lambda-to-dynamodb/ – Stefan

Antwort

20

Sie können durch die Konfiguration der Mapping-Vorlagen in den Integrationseinstellungen keine Anforderung Körperdaten in gültiges JSON-Format konvertieren, so dass AWS Lambda es empfangen kann.

Momentan scheint Amazon API Gateway offiziell noch keine Anwendung/x-www-form-urlencoded zu unterstützen, aber avilewin hat a solution gepostet, um das in den AWS-Foren zu tun. In den Mapping-Vorlagen können Sie Velocity Template Language (VTL) verwenden. Sie müssen also Mapping-Vorlagen konfigurieren, die das Format "application/x-www-form-urlencoded" in ein gültiges JSON-Format konvertieren. Natürlich ist das eine schmutzige Lösung, aber ich denke, das ist der einzige Weg, dies jetzt zu tun.

7

Sie können die params in JSON mit einer API-Gateway-Vorlage konvertieren: https://forums.aws.amazon.com/thread.jspa?messageID=673012&tstart=0#673012

Oder Sie können dies in der Lambda-Funktion tun selbst Abfrage-Zeichenfolge-Parser pacakge mit: https://www.npmjs.com/package/qs

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

Wenn Amazon gebaut fügt Ich unterstütze diese Funktion, ich werde das verwenden, aber bis dahin bevorzuge ich persönlich den zweiten Weg, weil es sauberer und einfacher zu debuggen ist, wenn etwas schief geht.

-Update Juli 2017:

Sie können Proxy-Integration verwenden, die es standardmäßig unterstützt: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

35

Gute Antwort von r7kamura.Zusätzlich ist hier ein Beispiel für eine verständliche und robuste Mapping-Vorlage für application/x-www-form-urlencoded, die für alle Fälle (vorausgesetzt, POST) funktioniert:

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

Es wäre eine Eingabe von

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

in

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

Ein Lambda-Handler könnte es so verwenden (dieses gibt alle Eingabedaten zurück):

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

Mann, nicht einmal eine einzige Verbesserung, das funktioniert wunderbar für mich, danke! – ObjectiveTruth

+1

hat perfekt funktioniert. Zog meine Haare in den letzten Tagen, versuchen, Facebook Canvas App mit aws zu laden. Netter Job @Marcus –

+0

Hallo! Ich versuche, diese Lösung zu verwenden und bis jetzt das Mapping lässt die Anfrage an das Lambda übergeben. Aber mein Körper ist immer null. Ich habe versucht, ein Modell zu erstellen, das mit dem Parameter des Formulars übereinstimmt, aber ohne Erfolg. Wenn jemand diese Lösung mit C# erfolgreich nutzen würde, wäre jede Hilfe erwünscht. – Lorien

1

Wenn Sie Lambda-Proxy-Integration ermöglichen enter image description here

Der Körper POST aus verfügbar sein:

event['body']['param'] 

GET-Parameter und Header wird ebenfalls verfügbar sein über

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

Integration Request/Body Mapping-Vorlagen

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

, wenn Sie zum Beispiel senden { "Daten": "Hallo Stac Koverflow! " }

Sie können event.data in Ihrem Lambda verwenden