Buch "GraphQL: Abfragesprache für moderne Webanwendungen"

Bild Hallo habrozhiteli! Wir haben ein Buch über die GraphQL-Abfragesprache veröffentlicht. Wir haben beschlossen, die Übersetzung des Kapitels „Anatomie von GraphQL-Abfragen“ zu teilen.

Snowtooth ist ein fiktives Skigebiet. Als Beispiele in diesem Kapitel werden wir so tun, als wäre dies ein echter Berg, und wir arbeiten dort. Wir werden untersuchen, wie das Snow Fang-Webteam GraphQL verwendet, um Echtzeitinformationen bereitzustellen: Informationen zum Status von Skiliften und Pisten. Snow Fang Ski Patrol kann Skilifte und Pisten direkt von Ihrem Smartphone aus öffnen und schließen. Informationen zu den Beispielen in diesem Kapitel finden Sie in der Snow Fang-Oberfläche auf der GraphQL Playground-Plattform (snowtooth.moonhighway.com/).


Mit der Abfrageoperation können Sie Daten von der API abfragen. Die Abfrage beschreibt die Daten, die Sie vom GraphQL-Server empfangen möchten. Wenn Sie eine Anfrage senden, fordern Sie Dateneinheiten nach Feld an. Diese Felder werden im selben Feld in der JSON-Datenantwort angezeigt, die Sie vom Server erhalten. Wenn Sie beispielsweise eine allLifts-Anforderung senden und die Felder name und status anfordern, sollten Sie eine JSON-Antwort erhalten, die ein Array von allLifts sowie die Namen- und Statuszeichenfolgen jedes Lifts enthält, wie hier gezeigt:

query { allLifts { name status } } 

Fehlerbehandlung
Erfolgreiche Anforderungen geben ein JSON-Dokument zurück, das den Datenschlüssel enthält. Fehlgeschlagene Anforderungen geben ein JSON-Dokument zurück, das den Fehlerschlüssel enthält. Details darüber, was schief gelaufen ist, werden unter diesem Schlüssel als JSON-Daten übertragen. Eine JSON-Antwort kann sowohl "Daten" als auch "Fehler" enthalten.

Sie können einem Abfragedokument mehrere Abfragen hinzufügen, es kann jedoch jeweils nur eine Operation initiiert werden. Sie können beispielsweise zwei Abfragevorgänge in ein Abfragedokument einfügen:

 query lifts { allLifts { name status } } query trails { allTrails { name difficulty } } 

Wenn Sie auf die Wiedergabetaste klicken, werden Sie von GraphQL Playground aufgefordert, eine dieser beiden Operationen auszuwählen.

Wenn Sie eine Anfrage für alle angegebenen Daten senden möchten, müssen Sie alles in dieselbe Anfrage einfügen:

 query liftsAndTrails { liftCount(status: OPEN) allLifts { name status } allTrails { name difficulty } } 

Hier sind die Vorteile von GraphQL. Wir können verschiedene Arten von Daten in einer Anfrage erhalten. Wir fordern einen LiftCount nach Status an, mit dem wir die Anzahl der Lifte ermitteln können, die derzeit diesen Status haben. Wir fordern auch den Namen und den Status jedes Aufzugs an. Schließlich fordern wir den Namen und den Status jeder Ablaufverfolgung an.

Abfrage ist eine Art von GraphQL. Wir nennen es den Stammtyp, weil es der Typ ist, der der Operation zugeordnet ist, und die Operationen die Wurzeln unseres Abfragedokuments sind. Die Felder, die in der GraphQL-API zum Abfragen verfügbar sind, werden in diesem API-Schema definiert. In der Dokumentation wird angegeben, welche Felder im Abfragetyp zur Auswahl stehen.

Die Dokumentation sagt uns, dass wir beim Aufrufen dieser API die Felder liftCount, allLifts und allTrails auswählen können. Es werden auch mehr Felder definiert, die zur Auswahl stehen. Der springende Punkt der Anforderung ist jedoch, dass wir auswählen können, welche Felder wir benötigen und welche wir weglassen müssen.

Wenn wir Abfragen schreiben, wählen wir die Felder aus, die wir benötigen, und schließen sie in geschweifte Klammern ein. Diese Blöcke werden Samples genannt. Die Felder, die wir in der Auswahl definieren, stehen in direktem Zusammenhang mit GraphQL-Typen. Die Felder liftCount, allLifts und allTrails werden im Abfragetyp definiert.

Sie können viele Auswahlen ineinander einbetten. Da das Feld allLifts eine Liftliste zurückgibt, müssen wir geschweifte Klammern verwenden, um eine neue Auswahl für diesen Typ zu erstellen. Es gibt alle Arten von Daten, die wir über den Aufzug anfordern können, aber in diesem Beispiel benötigen wir nur den Namen und den Status des Aufzugs. In ähnlicher Weise gibt eine allTrails-Anforderung Trail-Typen zurück.

Die JSON-Antwort enthält alle von uns angeforderten Daten. Diese Daten sind als JSON formatiert und werden in derselben Form wie unsere Anfrage geliefert. Jedes JSON-Feld erhält denselben Namen wie das Feld in unserem Beispiel. Wir können die Feldnamen im Antwortobjekt in der Anforderung ändern, indem wir Aliase angeben, wie unten gezeigt:

 query liftsAndTrails { open: liftCount(status: OPEN) chairlifts: allLifts { liftName: name status } skiSlopes: allTrails { name difficulty } } 

Das Folgende ist die Antwort:

 { "data": { "open": 5, "chairlifts": [ { "liftName": "Astra Express", "status": "open" } ], "skiSlopes": [ { "name": "Ditch of Doom", "difficulty": "intermediate" } ] } } 

Jetzt geben wir die Daten in derselben Form zurück, aber in unserer Antwort haben wir mehrere Felder umbenannt. Eine Möglichkeit, die Ergebnisse einer GraphQL-Abfrage zu filtern, besteht darin, die Abfrageargumente zu übergeben. Argumente sind ein Paar von Schlüsselwerten (oder Paaren), die einem Anforderungsfeld zugeordnet sind. Wenn nur die Namen der geschlossenen Aufzüge erforderlich sind, können wir ein Argument senden, das unsere Antwort filtert:

 query closedLifts { allLifts(status: "CLOSED" sortBy: "name") { name status } } 

Sie können auch Argumente verwenden, um Daten auszuwählen. Angenommen, wir müssen den Status einer einzelnen Seilbahn anfordern. Wir können einen Aufzug anhand seiner eindeutigen Kennung auswählen:

 query jazzCatStatus { Lift(id: "jazz-cat") { name status night elevationGain } } 

Hier sehen wir, dass die Antwort Name, Status, Nacht und Höhenunterschied für die Jazz Cat-Seilbahn enthält.

»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers
» Inhalt
» Auszug

25% Rabatt auf Gutschein für Händler - GraphQL

Nach Zahlung der Papierversion des Buches wird eine elektronische Version des Buches per E-Mail verschickt.

Source: https://habr.com/ru/post/de441194/


All Articles