2015-08-06 4 views
10

Ich versuche zu sehen, wie auf die Anfrage Header-und Körper Werte von mit im Lambda-Code zugreifen. Wenn der Anfragetext im JSON-Format vorliegt, wird er automatisch analysiert und im Ereignisobjekt verfügbar gemacht.Zugriff HTTP-Anfrage (Header, Query String, Cookies, Körper) Objekt in Lambda mit HTTP-Endpunkt

Wie kann ich auf die gesamte Abfragezeichenfolge, den Anfragetext, die Anforderungsheader (Cookies) für jede Art von eingehender "Content-Type" -Anfrage in Lambda zugreifen?


Die folgenden Änderungen sind Informationen, die ich gesammelt haben, um die Frage zu lösen, die nicht relevant sind oder nicht. Bitte ignorieren Sie sie, wenn Sie möchten.


EDIT:

Ich ging durch die bestehenden Fragen auf SE here und here. Nach diesem thread, sollte $input.json('$') den Trick tun. Ich nehme an, dass die Antworten aus diesen Links bereits veraltet sind, da das API-Gateway JSON in der Anfrage standardmäßig zu erkennen scheint und es dann im Objekt event verfügbar macht, ohne dass Mapping-Vorlagen konfiguriert sind.

Die Zuordnung wie vorgeschlagen einstellen, funktioniert nicht für mich. Es enthält nicht die Anforderungsheaderinformationen.

Hier sind Screenshots, wie es konfiguriert ist.

enter image description here


enter image description here

Die "Header" -Taste wird ein leeres. Mit $input.params('$') oder "$input.params('$')" Fehler aus.


EDIT 2

die Header in Verfahrensanforderungs Versuchte definieren. Immer noch nicht der User-Agent-Wert in Lambda.

enter image description here


EDIT 3

verwendete ich die folgende Vorlage Mapping an der API-Gateway

{ 
    "request": $input.json('$'), 
    "headers": "$input.params()" 
} 

und den Code unten in Lambda

context.succeed("event.key32:"+JSON.stringify(event, null, 2)); 

Und die Antwort durch die API-Gateway erzeugt zeigt diesen enter image description here

in der Antwort auf dem „Header“ Wert Blick sieht es aus wie die AWS-SDK/API-Gateway/Cloudfront streift alle Header aus dem HTTP-Client empfangen? Hier ist der vollständige Text aus dem JSON, der von $ input.params() zurückgegeben wurde.header

header={CloudFront-Forwarded-Proto=https, CloudFront-Is-Desktop-Viewer=true, CloudFront-Is-Mobile-Viewer=false, CloudFront-Is-SmartTV-Viewer=false, CloudFront-Is-Tablet-Viewer=false, Content-Type=application/json, Via=1.1 5d53b9570d94ce920abbd471.cloudfront.net (CloudFront), 1.1 95eea7baa7ec95c9a41eca9e3ab7.cloudfront.net (CloudFront), X-Amz-Cf-Id=GBqmObLRy6Iem9bJbVPrrW1K3YoWRDyAaMpv-UkshfCsHAA==, X-Forwarded-For=172.35.96.199, 51.139.183.101, X-Forwarded-Port=443, X-Forwarded-Proto=https}} 

Es ist nicht die User-Agent-String hat im Header, obwohl, wie der Screenshot oben zeigt, ist es durch die REST-Client gesendet wurde. Interessanterweise wird die gesamte Abfragezeichenfolge zur Verfügung gestellt. Nicht sicher, ob dies ein beabsichtigter Weg ist, um darauf zuzugreifen.

+0

Können Sie die Frage vereinfachen? Es ist jetzt wirklich aufgebläht. – kixorz

+1

@napalm, ich habe den Frageteil hervorgehoben. Bitte ignoriere die Änderungen. Um die Frage zusammenzufassen: Wie kann ich auf die gesamte Abfragezeichenfolge, den Anfragetext, die Anforderungsheader (Cookies) für jede Art von eingehenden "Content-Type" -Anfragen innerhalb von Lambda zugreifen? – user3526

Antwort

4

Die Request-Header können $input.params('header-name')

Überraschenderweise der User-Agent-Header mit obigen Code nicht zugegriffen werden kann unter Verwendung zugegriffen werden. Sie müssen sich durch the folgenden Reifen springen, um es abzurufen:

$context.identity.userAgent

Der Antrag Körper/Nutzlast zugänglich sein sollte mit dem folgenden Code. Weitere Referenz here, here und here:

{ 
    "reqbody": "$input.path('$')" 
} 

Es ist noch nicht klar, ob die Anforderung Körper in JSON sein soll. Es ist zu beachten, dass die Anfrage als UTF-8 nach this Post behandelt wird.


Es scheint derzeit zu sein, zwei bugs:

  1. Die "User-Agent" Header fehlt/wird durch die Amazon API abgezogen.
  2. Wenn die Kopfzeilenwerte ein doppeltes Anführungszeichen (") enthalten, wird die Lambda-Funktion nicht ausgeführt. (Ich sehe keinen Protokolleintrag in den Cloudwatch-Protokollen für solche Anforderungen.) Stattdessen enthält der http-Antworttextkörper folgende:

    { 
        "Type": "User", 
        "message": "Could not parse request body into json." 
    } 
    

Ein Beispiel Anfrage, die enter image description here

ich dies korrigiert werden müßte glauben an Amazon API nicht in der Lage sein, den ETag Mechanismus für ca zu implementieren Tsching.

Referenzen:

Ein Etag wird erwartet, innerhalb doppelte Anführungszeichen eingeschlossen werden. Es wird erwartet, dass der Browser diesen genauen Wert über den If-None-Match-Header zurücksendet, und hier bricht Amazon API.

Syntax for ETag?

HTTP: max length of etag

http://gsnedders.com/http-entity-tags-confusion

1

Sie haben die Informationen, die Sie in der Vorlage Mapping benötigen und schicken sie Ihre Lambda-Funktion zurück, dies ist einer der Vorlage, die ich verwendet, um Informationen an die Lambda-Funktion zu senden:

{ 
    "params" : "$input.params()", 
    "content-type-value" : "$input.params().header.get('Content-Type')", 
    "body" : "$input.json('$')", 
    "request-id": "$context.requestId", 
    "method": "$context.httpMethod", 
    "resource": "$context.resourcePath", 
    "id": "$input.params('id')" //This is a path parameter in my case 
} 

Sie tun können das gleiche, oder Sie können auf params.path.id zugreifen (wieder in meinem Fall). Hier ist die link zur Dokumentation.

Cheers,

1

ich die Zuordnungsvorlage ich eine in der Antwort der referenzierten Fragen verwendet aktualisiert, um die Useragent-Eigenschaft zu enthalten.

{ 
    "method": "$context.httpMethod", 
    "body": $input.json('$'), 
    "userAgent": "$context.identity.userAgent", 
    "headers": { 
    #foreach($param in $input.params().header.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "queryParams": { 
    #foreach($param in $input.params().querystring.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "pathParams": { 
    #foreach($param in $input.params().path.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end 

    #end 
    } 
} 

Eine detaillierte Erläuterung der Vorlage finden Sie hier: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/