zum Beispiel, wenn wir verwenden wollen
GET /user?name=bob
oder
GET /user/bob
Wie würden Sie beide Beispiele als Parameter an die Lambda-Funktion übergeben?
Ich habe in der Dokumentation etwas über das Festlegen eines "Abgebenen von" gesehen, aber diese Einstellung kann in der API-Gateway-Konsole nicht gefunden werden.
method.request.path.parameter-name
für einen Pfadparameter mit dem Namen parameter-name
, wie auf der Seite Method Request definiert.method.request.querystring.parameter-name
für einen Abfragezeichenfolgeparameter namens parameter-name
, wie auf der Seite Method Request definiert.Ich sehe keine dieser Optionen, obwohl ich eine Abfragezeichenfolge definiert habe.
Ab September 2017 müssen Sie keine Zuordnungen mehr für den Zugriff auf den Anforderungstext konfigurieren.
Alles, was Sie tun müssen, ist unter "Integrationsanforderung" unter "Ressource" zu überprüfen.
Sie können dann auf Abfrageparameter, Pfadparameter und Kopfzeilen wie auf diese zugreifen
event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
Um dies zu erreichen, sind folgende Schritte erforderlich:
Innerhalb der API Gateway Console ...
Resources -> Integration Request
application/json
explizit in das Feld für den Inhaltstyp ein, obwohl ein Standardwert angezeigt wird (wenn Sie dies nicht tun, wird es nicht gespeichert und es wird keine Fehlermeldung angezeigt.)setzen Sie dies in das Eingabemapping { "name": "$input.params('name')" }
klicken Sie auf das Kontrollkästchen neben der Dropdown-Liste der Vorlagen (ich gehe davon aus, dass dies das endgültige Speichern ist).
Ich habe diese Zuordnungsvorlage verwendet, um dem Lambda-Ereignis Body-, Header-, Methoden-, Pfad- und URL-Abfragezeichenfolgeparameter bereitzustellen. Ich habe einen Blogbeitrag geschrieben, in dem die Vorlage ausführlicher erläutert wird: http://kennbrodhagen.net/2015/12/06/wie- API-Gateway/
Hier ist die Zuordnungsvorlage, die Sie verwenden können:
{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"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
}
}
Heutzutage ist eine Dropdown-Vorlage in der API Gateway Console von AWS enthalten.
Klicken Sie für Ihre API auf den Ressourcennamen ... und dann auf GET
Erweitern Sie "Body Mapping-Vorlagen"
Eintippen
anwendung/Json
für Inhaltstyp (muss explizit eingegeben werden) und klicken Sie auf das Häkchen
Es öffnet sich ein neues Fenster mit den Worten "Vorlage generieren" und einer Dropdown-Liste (siehe Bild).
Wählen
Method Request Passthrough
Klicken Sie dann auf Speichern
Um auf Variablen zuzugreifen, verwenden Sie einfach die folgende Syntax (Python) Z. URL:
https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5
Sie können Variablen wie folgt erhalten:
from __future__ import print_function
import boto3
import json
print('Loading function')
def lambda_handler(event, context):
print(event['params']['querystring']['token'])
print(event['params']['querystring']['uid'])
Daher müssen Sie nicht jede gewünschte Variable explizit benennen oder zuordnen.
Die akzeptierte Antwort funktionierte gut für mich, aber um gimenetes Antwort zu erweitern, wollte ich eine generische Vorlage, mit der ich alle Abfrage-/Pfad-/Header-Parameter (nur als Zeichenfolgen für den Moment) durchgehen konnte, und die folgende Vorlage kam dazu. Ich poste es hier, falls jemand es nützlich findet:
#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
#set($success = $keys.add($key))
#end
#foreach($key in $input.params().headers.keySet())
#if(!$keys.contains($key))
#set($success = $keys.add($key))
#end
#end
#foreach($key in $input.params().path.keySet())
#if(!$keys.contains($key))
#set($success = $keys.add($key))
#end
#end
{
#foreach($key in $keys)
"$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}
Um Parameter an Ihre Lambda-Funktion zu übergeben, müssen Sie eine Zuordnung zwischen der API-Gateway-Anforderung und Ihrer Lambda-Funktion erstellen. Die Zuordnung erfolgt im Abschnitt Integration Request
-> Mapping templates
der ausgewählten API-Gateway-Ressource.
Erstellen Sie ein Mapping vom Typ application/json
, und rechts bearbeiten Sie die Vorlage (klicken Sie auf den Stift).
Eine Zuordnungsvorlage ist eigentlich eine Geschwindigkeitsvorlage, in der Sie Ifs, Loops und natürlich Variablen verwenden können. Die Vorlage enthält diese Variablen , mit denen Sie auf Abfrageparameter, Anforderungsheader usw. einzeln zugreifen können. Mit dem folgenden Code können Sie die gesamte Querzeichenfolge neu erstellen:
{
"querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
"body" : $input.json('$')
}
Hinweis: Klicken Sie auf das Häkchensymbol, um die Vorlage zu speichern. Sie können Ihre Änderungen mit der Schaltfläche "Test" in Ihrer Ressource testen. Um die Abfragezeichenfolgeparameter in der AWS-Konsole zu testen, müssen Sie die Parameternamen im Abschnitt Method Request
Ihrer Ressource definieren.
Hinweis: Weitere Informationen zur Geschwindigkeitssprache finden Sie im Velocity-Benutzerhandbuch .
Dann können Sie in Ihrer Lambda-Vorlage Folgendes tun, um die Querzeichenfolge analysieren zu lassen:
var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo
Als ich versuchte, eine meiner eigenen Fragen zu beantworten hier , bin ich auf diesen Trick gestoßen.
Verwenden Sie in der API-Gateway-Zuordnungsvorlage Folgendes, um die vollständige Abfragezeichenfolge anzugeben, die vom HTTP-Client gesendet wird:
{
"querystring": "$input.params().querystring"
}
Der Vorteil ist, dass Sie sich nicht auf einen Satz vordefinierter zugeordneter Schlüssel in Ihrer Abfragezeichenfolge beschränken müssen. Jetzt können Sie beliebige Schlüssel-Wert-Paare in der Abfragezeichenfolge akzeptieren, wenn Sie dies so tun möchten.
Hinweis: Gemäß this wird nur $input.params(x)
als für die VTL-Vorlage zur Verfügung gestellte Variable aufgeführt. Möglicherweise ändern sich die Interna und querystring
ist möglicherweise nicht mehr verfügbar.
Jetzt sollten Sie in der Lage sein, den neuen Proxy-Integrationstyp für Lambda zu verwenden, um automatisch die vollständige Anforderung in Standardform zu erhalten, anstatt Zuordnungen zu konfigurieren.
GET/user? Name = bob
{
"name": "$input.params().querystring.get('name')"
}
GET/Benutzer/Bob
{
"name": "$input.params('name')"
}
Viele Antworten sind großartig. Aber ich wollte etwas etwas einfacher ... Ich wollte etwas, das mit dem "Hello World" -Probe kostenlos funktioniert. Das bedeutet, ich wollte einen einfachen Anforderungshauptteil erzeugen, der mit der Abfragezeichenfolge übereinstimmt:
{
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}
Ich denke, dass die beste Antwort etwas nützlicher ist, wenn man etwas Reales baut, aber um eine schnelle Hallo-Welt mit der Vorlage von AWS zum Laufen zu bringen, funktioniert das großartig.
Im folgenden Beispiel für die Parameterzuordnung werden alle Parameter, einschließlich Pfad, Abfragenzeichenfolge und Header, über eine JSON-Nutzlast an den Integrationsendpunkt übergeben
#set($allParams = $input.params())
{
"params" : {
#foreach($type in $allParams.keySet())
#set($params = $allParams.get($type))
"$type" : {
#foreach($paramName in $params.keySet())
"$paramName" : "$util.escapeJavaScript($params.get($paramName))"
#if($foreach.hasNext),#end
#end
}
#if($foreach.hasNext),#end
#end
}
}
In der Tat gibt diese Zuordnungsvorlage alle Anforderungsparameter in der Nutzlast wie folgt aus:
{
"parameters" : {
"path" : {
"path_name" : "path_value",
...
}
"header" : {
"header_name" : "header_value",
...
}
'querystring" : {
"querystring_name" : "querystring_value",
...
}
}
}
Die Abfragezeichenfolge ist direkt in Javascript im Lambda zu analysieren
für GET/user? name = bob
var name = event.params.querystring.name;
Dies löst die GET-Benutzer/Bob-Frage jedoch nicht.
Die Lambda-Funktion erwartet eine JSON-Eingabe. Daher ist eine Analyse der Abfragezeichenfolge erforderlich. Die Lösung besteht darin, die Abfragezeichenfolge mithilfe der Zuordnungsvorlage in JSON zu ändern.
Ich habe es für C # .NET Core verwendet, daher sollte die erwartete Eingabe ein JSON mit dem Parameter "queryStringParameters" sein.
Befolgen Sie diese 4 Schritte, um dies zu erreichen:
application/json
content-tyap hinzu:Kopieren Sie die Vorlage unten, die die Abfragezeichenfolge in JSON analysiert, und fügen Sie sie in die Mappingvorlage ein:
{
"queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
}
Rufen Sie im API-Gateway Ihre Lambda-Funktion auf und fügen Sie die folgende Abfragezeichenfolge (für das Beispiel) hinzu: param1=111¶m2=222¶m3=333
Die Zuordnungsvorlage sollte unten die JSON-Ausgabe erstellen, d. H eingang für Ihre Lambda-Funktion.
{
"queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
}
Sie sind fertig. Ab diesem Punkt kann die Logik Ihrer Lambda-Funktion die Abfragezeichenfolgeparameter verwenden.
Viel Glück!
Als @ Jonathans Antwort, nach der Markierung Use Lambda Proxy integration in Integrationsanforderung , sollten Sie in Ihrem Quellcode das folgende Format verwenden, um pass by 502 Bad Gateway error.
NodeJS 8.10:
exports.handler = async (event, context, callback) => {
// TODO: You could get path, parameter, headers, body value from this
const { path, queryStringParameters, headers, body } = event;
const response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({
path,
query: queryStringParameters,
headers,
body: JSON.parse(body)
}),
"isBase64Encoded": false
};
return response;
};
Vergessen Sie nicht, Ihre resource am API Gateway bereitzustellen, bevor Sie die API erneut ausführen Antwort JSON gibt nur den Satz zurück, der in body korrekt ist Sie könnten Pfad, Parameter erhalten , Header, Körperwert aus Ereignis
const {path, queryStringParameters, headers, body} = Ereignis;
Sie können Lambda als "Lambda-Proxy-Integration" verwenden, diesbezüglich [ https://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simpl proxy-for-lambda.html # api-gateway-proxy-integration-lambda-function-python] , Optionen, die für dieses Lambda verfügbar sind
Für Nodejs Lambda 'Event.headers', 'event.pathParameters', 'event.body', 'event.stageVariables', Und 'event.requestContext'
Für Python Lambda Event ['headers'] ['parametername'] und so weiter