AWS AppSync Programmierleitfaden für Resolver-Mapping-Vorlagen - AWS AppSync

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

AWS AppSync Programmierleitfaden für Resolver-Mapping-Vorlagen

Anmerkung

Wir unterstützen jetzt hauptsächlich die APPSYNC _JS-Laufzeit und ihre Dokumentation. Bitte erwägen Sie, die APPSYNC _JS-Laufzeit und ihre Anleitungen hier zu verwenden.

Dies ist ein Tutorial im Stil eines Kochbuches zur Programmierung mit der Apache Velocity Template Language () VTL in. AWS AppSync Wenn Sie mit anderen Programmiersprachen wie JavaScript C oder Java vertraut sind, sollte es ziemlich einfach sein.

AWS AppSync verwendetVTL, um GraphQL-Anfragen von Clients in eine Anfrage an Ihre Datenquelle zu übersetzen. Anschließend wird der Prozess umgekehrt, um die Antwort der Datenquelle wieder in eine GraphQL-Antwort zu übersetzen. VTList eine logische Vorlagensprache, mit der Sie sowohl die Anfrage als auch die Antwort im standardmäßigen Anforderungs-/Antwortablauf einer Webanwendung bearbeiten können. Dabei kommen Techniken wie die folgenden zum Einsatz:

  • Standardwerte für neue Elemente

  • Eingabevalidierung und -formatierung

  • Umwandlung und Shaping von Daten

  • Durchlaufen von Listen, Zuweisungen und Arrays, um Werte auszusortieren oder zu ändern

  • Filtern/Ändern von Antworten basierend auf Benutzeridentität

  • Komplexe Autorisierungsprüfungen

Möglicherweise möchten Sie im Dienst eine Überprüfung der Telefonnummer für ein GraphQL-Argument durchführen oder einen Eingabeparameter in Großbuchstaben umwandeln, bevor Sie ihn in DynamoDB speichern. Oder vielleicht möchten Sie, dass Clientsysteme einen Code als Teil eines GraphQL-Arguments, JWT Token-Claims oder HTTP Headers bereitstellen und nur dann mit Daten antworten, wenn der Code mit einer bestimmten Zeichenfolge in einer Liste übereinstimmt. Dies sind alles logische Prüfungen, die Sie mit VTL in AWS AppSync durchführen können.

VTLermöglicht es Ihnen, Logik mithilfe von Programmiertechniken anzuwenden, die Ihnen vielleicht bekannt sind. Es muss jedoch innerhalb des standardmäßigen Anforderungs-/Antwortflusses ausgeführt werden, um sicherzustellen, dass Ihr GraphQL skalierbar API ist, wenn Ihre Benutzerbasis wächst. Da es AWS AppSync auch AWS Lambda als Resolver unterstützt wird, können Sie Lambda-Funktionen in der Programmiersprache Ihrer Wahl (Node.js, Python, Go, Java usw.) schreiben, wenn Sie mehr Flexibilität benötigen.

Aufstellen

Eine gängige Technik beim Erlernen einer Sprache besteht darin, Ergebnisse auszudrucken (z. B. console.log(variable) in JavaScript), um zu sehen, was passiert. In diesem Tutorial wird das demonstriert, indem wir ein einfaches GraphQL-Schema erstellen und eine Zuweisung von Werten an eine Lambda-Funktion weitergeben. Die Lambda-Funktion gibt die Werte aus und verwendet sie für die Antwort. Auf diese Weise lernen Sie den Anforderungs-/Antwort-Ablauf sowie die unterschiedlichen Programmiertechniken kennen.

Beginnen Sie mit der Erstellung des folgenden GraphQL-Schemas:

type Query { get(id: ID, meta: String): Thing } type Thing { id: ID! title: String! meta: String } schema { query: Query }

Erstellen Sie nun die folgende AWS Lambda Funktion und verwenden Sie dabei Node.js als Sprache:

exports.handler = (event, context, callback) => { console.log('VTL details: ', event); callback(null, event); };

Fügen Sie im Bereich Datenquellen der AWS AppSync Konsole diese Lambda-Funktion als neue Datenquelle hinzu. Gehen Sie zurück zur Schemaseite der Konsole und klicken Sie auf die ATTACHSchaltfläche rechts neben der get(...):Thing Abfrage. Für die Anforderungsvorlage wählen Sie die gewünschte Vorlage aus dem Menü Invoke and forward arguments (Argumente aufrufen und weiterleiten) aus. Wählen Sie als Antwortvorlage Return Lambda result (Lambda-Ergebnis zurückgeben) aus.

Öffnen Sie Amazon CloudWatch Logs für Ihre Lambda-Funktion an einem Ort und führen Sie auf der Registerkarte Abfragen der AWS AppSync Konsole die folgende GraphQL-Abfrage aus:

query test { get(id:123 meta:"testing"){ id meta } }

Die GraphQL-Antwort sollte id:123 und meta:testing enthalten, da die Lambda-Funktion diese zurückgibt. Nach einigen Sekunden sollten Sie in CloudWatch Logs ebenfalls einen Datensatz mit diesen Details sehen.

Variablen

VTLverwendet Verweise, die Sie zum Speichern oder Bearbeiten von Daten verwenden können. Es gibt drei Arten von Verweisen inVTL: Variablen, Eigenschaften und Methoden. Variablen ist ein $-Symbol vorangestellt und sie werden mit der #set-Richtlinie erstellt:

#set($var = "a string")

Variablen speichern Typen ähnlich denen, mit denen Sie von anderen Sprachen her vertraut sind, z. B. Zahlen, Zeichenfolgen, Arrays, Listen und Zuordnungen. Möglicherweise haben Sie bemerkt, dass in der Standardanforderungsvorlage für Lambda-Resolver eine JSON Nutzlast gesendet wurde:

"payload": $util.toJson($context.arguments)

Ein paar Dinge, die Sie hier beachten sollten: Erstens AWS AppSync bietet es mehrere Komfortfunktionen für allgemeine Operationen. $util.toJsonKonvertiert in diesem Beispiel eine Variable inJSON. Zweitens wird die Variable $context.arguments automatisch von einer GraphQL-Anforderung als Zuweisungsobjekt eingetragen. Sie können folgendermaßen eine neue Zuweisung erstellen:

#set( $myMap = { "id": $context.arguments.id, "meta": "stuff", "upperMeta" : $context.arguments.meta.toUpperCase() } )

Sie haben jetzt eine Variable mit dem Namen $myMap und den Schlüsseln id, meta und upperMeta erstellt. Dies demonstriert einige Dinge:

  • Für id wird ein Schlüssel aus den GraphQL-Argumenten eingetragen. Dies ist üblichVTL, wenn Argumente von Kunden abgerufen werden.

  • meta ist fest kodiert mit einem Wert, der Standardwerte darstellt.

  • upperMeta wandelt das Argument meta mithilfe der Methode .toUpperCase() um.

Setzen Sie den vorherigen Code oben auf Ihre Anforderungsvorlage und ändern Sie payload so, dass die neue Variable $myMap verwendet wird:

"payload": $util.toJson($myMap)

Führen Sie Ihre Lambda-Funktion aus, und Sie können die Änderung der Antwort sowie diese Daten in CloudWatch Protokollen sehen. Im Verlauf dieses Tutorials werden wir weiterhin $myMap angeben, sodass Sie ähnliche Tests durchführen können.

Sie können auch properties_ für Ihre Variablen festlegen. Dies können einfache Zeichenketten, Arrays sein oder: JSON

#set($myMap.myProperty = "ABC") #set($myMap.arrProperty = ["Write", "Some", "GraphQL"]) #set($myMap.jsonProperty = { "AppSync" : "Offline and Realtime", "Cognito" : "AuthN and AuthZ" })

Ruhige Referenzen

Da VTL es sich um eine Vorlagensprache handelt, funktioniert jede Referenz, die Sie ihr geben, standardmäßig. .toString() Wenn die Referenz nicht definiert ist, wird die tatsächliche Referenzdarstellung als Zeichenfolge ausgegeben. Beispielsweise:

#set($myValue = 5) ##Prints '5' $myValue ##Prints '$somethingelse' $somethingelse

Um dieses Problem zu beheben, VTL verfügt sie über eine stille Referenz - oder stille Referenzsyntax, die die Template-Engine anweist, dieses Verhalten zu unterdrücken. Die Syntax dafür lautet $!{}. Wenn wir beispielsweise den vorherigen Code leicht ändern, sodass $!{somethingelse} verwendet wird, wird die Druckausgabe unterdrückt:

#set($myValue = 5) ##Prints '5' $myValue ##Nothing prints out $!{somethingelse}

Methoden aufrufen

In einem früheren Beispiel haben wir gezeigt, wie eine Variable erstellt und gleichzeitig Werte festlegt werden. Sie können dies auch in zwei Schritten durchführen, indem Sie der Zuweisung folgendermaßen Daten hinzufügen:

#set ($myMap = {}) #set ($myList = []) ##Nothing prints out $!{myMap.put("id", "first value")} ##Prints "first value" $!{myMap.put("id", "another value")} ##Prints true $!{myList.add("something")}

HOWEVERÜber dieses Verhalten gibt es etwas zu wissen. Auch wenn die Notation zum Unterdrücken der Referenz ($!{}) das Aufrufen von Methoden ermöglicht (siehe oben), unterdrückt sie nicht den zurückgegebenen Wert der ausgeführten Methode. Aus diesem Grund haben wir auf ##Prints "first value" und ##Prints true oben hingewiesen. Dies kann zu Fehlern führen, wenn Sie Zuordnungen oder Listen durchlaufen, z. B. zum Einfügen eines Werts, wenn bereits ein Schlüssel vorhanden ist, da die Ausgabe nach erfolgter Prüfung unerwartete Zeichenfolgen zur Vorlage hinzufügt.

Um dieses Problem zu umgehen, ist es manchmal hilfreich, die Methoden mithilfe einer #set-Richtlinie aufzurufen und die Variable zu ignorieren. Beispielsweise:

#set ($myMap = {}) #set($discard = $myMap.put("id", "first value"))

Sie können diese Technik in Ihren Vorlagen verwenden, da sie verhindert, dass unerwartete Zeichenketten in der Vorlage gedruckt werden. AWS AppSync bietet eine alternative Komfortfunktion, die dasselbe Verhalten in einer prägnanteren Schreibweise bietet. Somit müssen Sie sich keine Gedanken über diese speziellen Anforderungen bei der Implementierung machen. Sie können diese Funktion unter $util.quiet() oder dem zugehörigen Alias $util.qr() aufrufen. Beispielsweise:

#set ($myMap = {}) #set ($myList = []) ##Nothing prints out $util.quiet($myMap.put("id", "first value")) ##Nothing prints out $util.qr($myList.add("something"))

Zeichenfolgen

Wie bei vielen Programmiersprachen kann der Umgang mit Zeichenfolgen schwierig sein, vor allem, wenn Sie sie aus Variablen erstellen möchten. Es gibt einige alltägliche Dinge, die sich VTL einfallen lassen.

Angenommen, Sie fügen Daten als Zeichenfolge in eine Datenquelle wie DynamoDB ein, aber sie werden aus einer Variablen aufgefüllt, z. B. einem GraphQL-Argument. Eine Zeichenfolge enthält doppelte Anführungszeichen und zur Referenzierung der Variable in einer Zeichenfolge benötigen Sie nur "${}" (also kein ! wie in der Notation zur Unterdrückung der Referenz). Dies ähnelt einem Vorlagenliteral in: https://developer.mozilla. JavaScript org/en-US/docs/Web/JavaScript/Reference/Template_Literale

#set($firstname = "Jeff") $!{myMap.put("Firstname", "${firstname}")}

Sie können dies in DynamoDB-Anforderungsvorlagen sehen, z. B. "author": { "S" : "${context.arguments.author}"} bei der Verwendung von Argumenten von GraphQL-Clients oder bei der automatischen ID-Generierung wie. "id" : { "S" : "$util.autoId()"} Dies bedeutet, dass Sie eine Variable oder das Ergebnis einer Methode innerhalb einer Zeichenfolge referenzieren können, um Daten einzutragen.

Sie können auch öffentliche Methoden der Klasse String von Java verwenden, z. B. das Extrahieren einer Teilzeichenfolge:

#set($bigstring = "This is a long string, I want to pull out everything after the comma") #set ($comma = $bigstring.indexOf(',')) #set ($comma = $comma +2) #set ($substring = $bigstring.substring($comma)) $util.qr($myMap.put("substring", "${substring}"))

Auch die Zeichenfolgenverkettung ist eine sehr häufige Aufgabe. Sie können sie allein mit Variablenreferenzen oder mit statischen Werten ausführen:

#set($s1 = "Hello") #set($s2 = " World") $util.qr($myMap.put("concat","$s1$s2")) $util.qr($myMap.put("concat2","Second $s1 World"))

Loops

Nachdem Sie nun Variablen erstellt und Methoden aufgerufen haben, können Sie Ihrem Code eine Logik hinzufügen. Im Gegensatz zu anderen Sprachen VTL erlaubt es nur Schleifen, bei denen die Anzahl der Iterationen vorgegeben ist. In Velocity gibt es kein do..while. Dieser Aufbau stellt sicher, dass die Bewertung stets beendet wird, und gibt Grenzen für die Skalierbarkeit vor, wenn Ihre GraphQL-Operationen ausgeführt werden.

Loops werden mithilfe von #foreach erstellt und erfordern die Eingabe einer Loop-Variable und eines wiederholbaren Objekts, z. B. ein Array, eine Liste, Zuweisung oder Sammlung. Ein Beispiel für eine klassische Programmierung mit einem #foreach-Loop ist, nach den Elementen in einer Sammlung zu suchen und diese auszugeben. In unserem Fall sortieren wir sie aus und fügen sie der Zuweisung hinzu:

#set($start = 0) #set($end = 5) #set($range = [$start..$end]) #foreach($i in $range) ##$util.qr($myMap.put($i, "abc")) ##$util.qr($myMap.put($i, $i.toString()+"foo")) ##Concat variable with string $util.qr($myMap.put($i, "${i}foo")) ##Reference a variable in a string with "${varname}" #end

Das folgende Beispiel zeigt einige Dinge. Zum einen werden Variablen mit dem Bereichsoperator [..] zum Erstellen eines wiederholbaren Objekts verwendet. Dann wird jedes Element durch die Variable $i referenziert, mit der Sie arbeiten können. Im vorherigen Beispiel sehen Sie auch Kommentare, die mit einem doppelten Rautenzeichen ## gekennzeichnet sind. Dies demonstriert außerdem die Verwendung der Loop-Variable sowohl in den Schlüsseln als auch in den Werten sowie andere Methoden der Verkettung mithilfe von Zeichenfolgen.

Beachten Sie, dass $i eine Ganzzahl ist. Sie können also eine .toString()-Methode aufrufen. Für GraphQL-Typen von INT kann dies praktisch sein.

Sie können auch direkt einen Bereichsoperator verwenden, zum Beispiel:

#foreach($item in [1..5]) ... #end

Arrays

Sie haben bis zu diesem Zeitpunkt eine Map manipuliert, aber Arrays sind auch üblich in. VTL Mit Arrays haben Sie auch Zugriff auf einige zugrunde liegenden Methoden wie .isEmpty(), .size(), .set(), .get() und .add(), wie unten gezeigt:

#set($array = []) #set($idx = 0) ##adding elements $util.qr($array.add("element in array")) $util.qr($myMap.put("array", $array[$idx])) ##initialize array vals on create #set($arr2 = [42, "a string", 21, "test"]) $util.qr($myMap.put("arr2", $arr2[$idx])) $util.qr($myMap.put("isEmpty", $array.isEmpty())) ##isEmpty == false $util.qr($myMap.put("size", $array.size())) ##Get and set items in an array $util.qr($myMap.put("set", $array.set(0, 'changing array value'))) $util.qr($myMap.put("get", $array.get(0)))

Im vorherigen Beispiel wurde die Array-Indexnotation verwendet, um ein Element mit abzurufen. arr2[$idx] Auf ähnliche Weise können Sie Elemente nach Namen aus einer Zuweisung/einem Wörterbuch abrufen:

#set($result = { "Author" : "Nadia", "Topic" : "GraphQL" }) $util.qr($myMap.put("Author", $result["Author"]))

Dies wird sehr häufig beim Filtern von Ergebnissen eingesetzt, die von Datenquellen in Antwortvorlagen zurückgegeben werden, wenn Bedingungen verwendet werden.

Bedingte Prüfungen

Im vorherigen Abschnitt wurden einige Beispiele für die Verwendung von Logik zur Transformation von Daten #foreach vorgestellt. VTL Sie können auch bedingte Prüfungen anwenden, um Daten zur Laufzeit auszuwerten:

#if(!$array.isEmpty()) $util.qr($myMap.put("ifCheck", "Array not empty")) #else $util.qr($myMap.put("ifCheck", "Your array is empty")) #end

Die oben gezeigte #if()-Prüfung eines booleschen Ausdrucks ist interessant, doch für eine Verzweigung können Sie auch Operatoren und #elseif() einsetzen:

#if ($arr2.size() == 0) $util.qr($myMap.put("elseIfCheck", "You forgot to put anything into this array!")) #elseif ($arr2.size() == 1) $util.qr($myMap.put("elseIfCheck", "Good start but please add more stuff")) #else $util.qr($myMap.put("elseIfCheck", "Good job!")) #end

Diese beiden Beispiele demonstrieren Negation (!) und Gleichheit (==). Wir können auch ||, &&, >, <, >=, <= und != verwenden.

#set($T = true) #set($F = false) #if ($T || $F) $util.qr($myMap.put("OR", "TRUE")) #end #if ($T && $F) $util.qr($myMap.put("AND", "TRUE")) #end

Hinweis: Bei Bedingungen werden nur Boolean.FALSE und null als falsch angesehen. Null (0) und leere Zeichenfolgen ("") gelten nicht als falsch.

Operatoren

Keine Programmiersprache wäre vollständig ohne Operatoren zum Ausführen mathematischer Aktionen. Hier finden Sie einige Beispiele für den Einstieg:

#set($x = 5) #set($y = 7) #set($z = $x + $y) #set($x-y = $x - $y) #set($xy = $x * $y) #set($xDIVy = $x / $y) #set($xMODy = $x % $y) $util.qr($myMap.put("z", $z)) $util.qr($myMap.put("x-y", $x-y)) $util.qr($myMap.put("x*y", $xy)) $util.qr($myMap.put("x/y", $xDIVy)) $util.qr($myMap.put("x|y", $xMODy))

Schleifen und Bedingungen zusammen verwenden

Bei der Transformation von DatenVTL, z. B. vor dem Schreiben oder Lesen aus einer Datenquelle, kommt es häufig vor, Objekte in einer Schleife zu durchlaufen und dann Prüfungen durchzuführen, bevor eine Aktion ausgeführt wird. Durch die Kombination von Werkzeugen aus den vorherigen Abschnitten bietet sich Ihnen eine große Funktionalität. Dabei ist es hilfreich, zu wissen, dass #foreach Ihnen automatisch .count für jedes Element angibt:

#foreach ($item in $arr2) #set($idx = "item" + $foreach.count) $util.qr($myMap.put($idx, $item)) #end

Zum Beispiel möchten Sie eventuell nur Werte aus einer Zuweisung aussortieren, wenn diese eine bestimmte Größe unterschreitet. Die Verwendung der Anzahl zusammen mit Bedingungen und der Anweisung #break ermöglicht Ihnen das:

#set($hashmap = { "DynamoDB" : "https://aws.amazon.com/dynamodb/", "Amplify" : "https://github.com/aws/aws-amplify", "DynamoDB2" : "https://aws.amazon.com/dynamodb/", "Amplify2" : "https://github.com/aws/aws-amplify" }) #foreach ($key in $hashmap.keySet()) #if($foreach.count > 2) #break #end $util.qr($myMap.put($key, $hashmap.get($key))) #end

Das vorherige #foreach wird mit .keySet() wiederholt, das Sie in Zuweisungen verwenden können. Dadurch können Sie $key abrufen und den Wert mithilfe von .get($key) referenzieren. GraphQL-Argumente von Clients in AWS AppSync werden als Map gespeichert. Sie können auch mit .entrySet() wiederholt werden, sodass Sie dann Schlüssel und Werte gemeinsam abrufen können, und entweder andere Variablen eintragen oder komplexe bedingte Prüfungen durchführen, z. B. die Validierung oder Umwandlung von Eingaben:

#foreach( $entry in $context.arguments.entrySet() ) #if ($entry.key == "XYZ" && $entry.value == "BAD") #set($myvar = "...") #else #break #end #end

Andere gängige Beispiele sind das automatische Ausfüllen von Standardinformationen, wie die anfänglichen Objektversionen beim Synchronisieren von Daten (sehr wichtig bei der Konfliktlösung) oder der Standardbesitzer eines Objekts für Autorisierungsprüfungen. Mary hat diesen Blogbeitrag erstellt, also:

#set($myMap.owner ="Mary") #set($myMap.defaultOwners = ["Admins", "Editors"])

Kontext

Da Sie nun besser mit der Durchführung logischer Prüfungen in AWS AppSync Resolvern mit vertraut sindVTL, werfen Sie einen Blick auf das Kontextobjekt:

$util.qr($myMap.put("context", $context))

Dieses enthält alle Informationen, die Sie in Ihrer GraphQL-Anforderung abrufen können. Eine detaillierte Erläuterung finden Sie in der Kontextreferenz.

Filtern

Bisher wurden in diesem Tutorial alle Informationen aus Ihrer Lambda-Funktion mit einer sehr einfachen JSON Transformation an die GraphQL-Abfrage zurückgegeben:

$util.toJson($context.result)

Die VTL Logik ist genauso leistungsfähig, wenn Sie Antworten von einer Datenquelle erhalten, insbesondere wenn Sie Autorisierungsprüfungen für Ressourcen durchführen. Sehen wir uns nun einige Beispiele an. Ändern Sie zunächst Ihre Antwortvorlage wie in diesem Beispiel:

#set($data = { "id" : "456", "meta" : "Valid Response" }) $util.toJson($data)

Unabhängig davon, was mit Ihrer GraphQL-Operation geschieht, werden fest kodierte Werte an den Client zurückgegeben. Ändern Sie dies, sodass in das Feld meta Daten aus der Lambda-Antwort eingetragen werden, die Sie weiter oben im Tutorial im Abschnitt über Bedingungen im elseIfCheck-Wert festgelegt haben:

#set($data = { "id" : "456" }) #foreach($item in $context.result.entrySet()) #if($item.key == "elseIfCheck") $util.qr($data.put("meta", $item.value)) #end #end $util.toJson($data)

$context.result ist eine Zuweisung, daher können Sie entrySet() verwenden, um Logik entweder auf die zurückgegebenen Schlüssel oder auf die Werte anzuwenden. Da $context.identity Informationen über den Benutzer enthält, der die GraphQL-Operation durchgeführt hat, können Sie beim Zurückgeben von Autorisierungsinformationen aus der Datenquelle entscheiden, ob alle, einige oder keine Daten an einen Benutzer zurückgegeben werden, basierend auf Ihrer Logik. Ändern Sie Ihre Antwortvorlage, sodass sie wie folgt aussieht:

#if($context.result["id"] == 123) $util.toJson($context.result) #else $util.unauthorized() #end

Wenn Sie Ihre GraphQL-Abfrage ausführen, werden die Daten wie gewohnt zurückgegeben. Wenn Sie jedoch das ID-Argument auf einen anderen Wert als 123 ändern (query test { get(id:456 meta:"badrequest"){} }), erhalten Sie eine Autorisierungsfehlermeldung.

Weitere Beispiele für Autorisierungsszenarien finden Sie im Abschnitt zu den Autorisierungsanwendungsfällen.

Beispiel für eine Vorlage

Wenn Sie dem Tutorial gefolgt sind, haben Sie eventuell Schritt für Schritt diese Vorlage erstellt. Falls Sie dies nicht getan haben, fügen wir es unten ein, um es für Tests zu kopieren.

Request Template

#set( $myMap = { "id": $context.arguments.id, "meta": "stuff", "upperMeta" : "$context.arguments.meta.toUpperCase()" } ) ##This is how you would do it in two steps with a "quiet reference" and you can use it for invoking methods, such as .put() to add items to a Map #set ($myMap2 = {}) $util.qr($myMap2.put("id", "first value")) ## Properties are created with a dot notation #set($myMap.myProperty = "ABC") #set($myMap.arrProperty = ["Write", "Some", "GraphQL"]) #set($myMap.jsonProperty = { "AppSync" : "Offline and Realtime", "Cognito" : "AuthN and AuthZ" }) ##When you are inside a string and just have ${} without ! it means stuff inside curly braces are a reference #set($firstname = "Jeff") $util.qr($myMap.put("Firstname", "${firstname}")) #set($bigstring = "This is a long string, I want to pull out everything after the comma") #set ($comma = $bigstring.indexOf(',')) #set ($comma = $comma +2) #set ($substring = $bigstring.substring($comma)) $util.qr($myMap.put("substring", "${substring}")) ##Classic for-each loop over N items: #set($start = 0) #set($end = 5) #set($range = [$start..$end]) #foreach($i in $range) ##Can also use range operator directly like #foreach($item in [1...5]) ##$util.qr($myMap.put($i, "abc")) ##$util.qr($myMap.put($i, $i.toString()+"foo")) ##Concat variable with string $util.qr($myMap.put($i, "${i}foo")) ##Reference a variable in a string with "${varname)" #end ##Operators don't work #set($x = 5) #set($y = 7) #set($z = $x + $y) #set($x-y = $x - $y) #set($xy = $x * $y) #set($xDIVy = $x / $y) #set($xMODy = $x % $y) $util.qr($myMap.put("z", $z)) $util.qr($myMap.put("x-y", $x-y)) $util.qr($myMap.put("x*y", $xy)) $util.qr($myMap.put("x/y", $xDIVy)) $util.qr($myMap.put("x|y", $xMODy)) ##arrays #set($array = ["first"]) #set($idx = 0) $util.qr($myMap.put("array", $array[$idx])) ##initialize array vals on create #set($arr2 = [42, "a string", 21, "test"]) $util.qr($myMap.put("arr2", $arr2[$idx])) $util.qr($myMap.put("isEmpty", $array.isEmpty())) ##Returns false $util.qr($myMap.put("size", $array.size())) ##Get and set items in an array $util.qr($myMap.put("set", $array.set(0, 'changing array value'))) $util.qr($myMap.put("get", $array.get(0))) ##Lookup by name from a Map/dictionary in a similar way: #set($result = { "Author" : "Nadia", "Topic" : "GraphQL" }) $util.qr($myMap.put("Author", $result["Author"])) ##Conditional examples #if(!$array.isEmpty()) $util.qr($myMap.put("ifCheck", "Array not empty")) #else $util.qr($myMap.put("ifCheck", "Your array is empty")) #end #if ($arr2.size() == 0) $util.qr($myMap.put("elseIfCheck", "You forgot to put anything into this array!")) #elseif ($arr2.size() == 1) $util.qr($myMap.put("elseIfCheck", "Good start but please add more stuff")) #else $util.qr($myMap.put("elseIfCheck", "Good job!")) #end ##Above showed negation(!) and equality (==), we can also use OR, AND, >, <, >=, <=, and != #set($T = true) #set($F = false) #if ($T || $F) $util.qr($myMap.put("OR", "TRUE")) #end #if ($T && $F) $util.qr($myMap.put("AND", "TRUE")) #end ##Using the foreach loop counter - $foreach.count #foreach ($item in $arr2) #set($idx = "item" + $foreach.count) $util.qr($myMap.put($idx, $item)) #end ##Using a Map and plucking out keys/vals #set($hashmap = { "DynamoDB" : "https://aws.amazon.com/dynamodb/", "Amplify" : "https://github.com/aws/aws-amplify", "DynamoDB2" : "https://aws.amazon.com/dynamodb/", "Amplify2" : "https://github.com/aws/aws-amplify" }) #foreach ($key in $hashmap.keySet()) #if($foreach.count > 2) #break #end $util.qr($myMap.put($key, $hashmap.get($key))) #end ##concatenate strings #set($s1 = "Hello") #set($s2 = " World") $util.qr($myMap.put("concat","$s1$s2")) $util.qr($myMap.put("concat2","Second $s1 World")) $util.qr($myMap.put("context", $context)) { "version" : "2017-02-28", "operation": "Invoke", "payload": $util.toJson($myMap) }

Antwortvorlage

#set($data = { "id" : "456" }) #foreach($item in $context.result.entrySet()) ##$context.result is a MAP so we use entrySet() #if($item.key == "ifCheck") $util.qr($data.put("meta", "$item.value")) #end #end ##Uncomment this out if you want to test and remove the below #if check ##$util.toJson($data) #if($context.result["id"] == 123) $util.toJson($context.result) #else $util.unauthorized() #end