GraphQL

GraphQL

Copyright © Shutterstock / samjoule

Was ist GraphQL?

Bei GraphQL handelt es sich um eine Schnittstelle zur Übertragung strukturierter Daten zwischen verschiedenen Anwendungen. Das UrsprĂŒnglich von Facebook entwickelte GraphQL stellt gleichermaßen eine API-Beschreibung als auch eine Abfragesprache dar. Die Bedeutung geht inzwischen weit ĂŒber Facebook hinaus, da sich GraphQL zu einer wichtigen Konkurrenz fĂŒr SOAP und REST entwickelt hat. Seine StĂ€rken kommen insbesondere dann zum Tragen, wenn es um aufwĂ€ndigere Anfragen geht.

Überblick und Allgemeines

GraphQL ist seit seiner Entwicklung durch Facebook im Jahr 2012 im Einsatz. Als Abfragesprache nutzt sie nur eine URL fĂŒr sĂ€mtliche Abfragen. Dies ist eine Eigenschaft, die es etwa von REST unterscheidet. Aus diesem Grunde ist es fĂŒr Entwickler nur erforderlich, ein Schema mit abfragbaren Typen fĂŒr eine GraphQL-Struktur zu entwerfen. Dazu gehören die Funktionen, mit denen sich Anfragen zu diesen Typen auslösen lassen. Auf diese Weise wird gewĂ€hrleistet, dass die API zum grĂ¶ĂŸten Teil selbstdokumentierend ist. Hierbei existieren Bibliotheken fĂŒr Clients und Server in nahezu sĂ€mtlichen Programmiersprachen, wobei die Node.js-Implementierung besonders weite Verbreitung hat, da sie sich auf einfache Weise in Server oder Anwendungen (etwa Express.js) einbinden lĂ€sst.

Die Abfragesprache beherrscht lesende wie auch schreibende Operationen fĂŒr Web-Applikationen. Das ursprĂŒngliche Entwicklungsziel seitens Facebook war es, Datenmaterial fĂŒr mobile Anwendungen vom Server zu laden. Der Anspruch bestand darin, diesen Prozess so einfach wie möglich zu gestalten. Entwickler sollten die Abfragesprache schnell erlernen können.

Einordnung

GraphQL stellt weniger ein spezifisches Produkt dar, sondern mehr eine Idee, die sich in mehreren Sprachen umsetzen lĂ€sst und inzwischen auch in zahlreichen Sprachen realisiert worden ist. So finden sich etwa Java-Implementierungen oder auch Umsetzungen mit PHP und Go. GrundsĂ€tzlich ist GraphQL auf einer Ebene mit SOAP und REST einzuordnen. Die Sprache findet Einsatz bei der Formulierung von Anfragen an einen Server. Hierbei ist die konkrete Implementierung der Applikationslogik nicht Gegenstand der Schnittstelle selbst. Auch in einer bereits bestehenden Applikation kann es zur Anwendung kommen, wobei es nicht erforderlich ist, grĂ¶ĂŸere Bestandteile des Quellcodes zu ersetzen.

In der modernen Entwicklung von Web-Services und Backends hat REST als Architekturstil große Verbreitung erfahren. Doch ist die RESTful-Architektur nicht zwingend in jeder Aufgabe der optimale Lösungsansatz. Gerade aufgrund der spezifischen Anforderungen mobiler Clients kam es zur Entwicklung GraphQLs, dessen Anwendungsbereich daher deutlich ĂŒber Facebook hinausgeht.

In Abgrenzung zu REST ist es bei GraphQL nicht vorgesehen, sĂ€mtliche Ressourcen ĂŒber eine je eindeutige URL anzusprechen. Anders als dort gibt es bei GraphQL lediglich eine einzige URL fĂŒr alle Daten. Bei der Abfrage kommt eine Zeichenkette in strukturierter Form zum Einsatz. Diese Zeichenkette dient gleichermaßen der Vorgabe der Antwortstruktur.

Funktionsweise

GraphQL basiert auf einem bestimmten Schema, das von einem Server zur VerfĂŒgung gestellt wird. Das Schema ist ĂŒber die Interface-Definition-Language (IDL) beschrieben und arbeitet gemĂ€ĂŸ Schema-First-Ansatz. Das heißt, dass zunĂ€chst ein Vertrag zwischen Client und Server durch das Schema festgelegt wird, wĂ€hrend die Daten im Fokus stehen. Im Rahmen des klar typisierten Schemas sind verschiedenartige Datentypen vorgesehen. Dazu gehören einfachere Typen wie Float, Int, ID oder Boolean, jedoch auch aufwĂ€ndigere und geschachtelte Objekttypen, die ĂŒber eigene Felder verfĂŒgen. Ebenso bezeichnet das Schema bestimmte Operationen, die Anwendung auf den Objektgrafen finden können.

GrundsĂ€tzlich ist bei den Operationen zwischen lesenden und schreibenden VorgĂ€ngen zu unterscheiden. Lesende Operationen werden auch Queries genannt, wĂ€hrend schreibende Operationen unter der Bezeichnung Mutations bekannt sind. Die Interface Definition Language ermöglicht ebenfalls eine Beschreibung der Operationen. Auf diese Weise ist es möglich, verfĂŒgbare Operationen als zusĂ€tzliche Elemente des Schemas zu definieren.

Eigenschaften und Abgrenzung

FĂŒr den gelingenden Einsatz von GraphQL ist es wichtig, die Charakteristika zu kennen, mit denen es sich von REST oder SOAP abgrenzt. GrundsĂ€tzlich gibt die Anfrage bereits die Struktur der Antwort vor. Der angefragte Server liefert hierbei lediglich die Felder, die der Client bereits im Rahmen der Anfrage angibt.

Weiterhin ist GraphQL eine Abfragesprache, die mit eigenstĂ€ndigem Datentypsystem arbeitet. Entwickler legen bestimmte Datentypen auf Seiten des Servers fest. Hierbei basiert ein Datentyp auf einem Feld oder mehreren Feldern. Diese können wiederum mit Typangaben versehen werden. Die Datentypen geben den Rahmen fĂŒr Abfragen vor, indem sie die Datenstrukturen schaffen. Aufgrund dieses Typsystems handelt es sich bei GraphQL um ein weitestgehend selbstdokumentierendes System. Über Anfragen lassen sich das vollstĂ€ndige Schema sowie auch die Struktur einzelner Typen auslesen. Aufgrund dessen ist eine vollumfĂ€ngliche Beschreibung der Schnittstelle möglich.

GraphQL ist ein dynamisches System, das keiner Versionierung der Schnittstellen mehr bedarf. Bestehende Aufgaben werden nicht durch neue Felder beeinflusst. Solche Felder, die nicht mehr benötigt werden, können Entwickler entsprechend markieren. Diese Markierungen lassen sich durch Introspektion auslesen und bei Bedarf zu spÀteren Zeitpunkten löschen.

Optimierung der Performance

Clientseitig kann GraphQL innerhalb des festgelegten Schemas den Umfang einer Antwort frei definieren. Es kann zu einer Herausforderung werden, die Anfragen im Server schnell und effizient abzuarbeiten. Die Anforderungen wachsen insbesondere, wenn es sich um die Anfrage einer Vielzahl geschachtelter Felder handelt. Auch Zugriffe auf nachgeschaltete Backend-Systeme können zu Performance-Problemen fĂŒhren.

Aus diesem Grunde finden sich mehrere AnsÀtze, die Performance des GraphQL-Servers zu optimieren. Geht es um den Java-Bereich, lassen sich Zugriffe mit dem java-dataloader zur Optimierung der Zugriffe nutzen. Diese Bibliothek lÀsst sich einsetzen, um Anfragen an Datenbanken oder Web-Services zusammenzufassen oder zu parallelisieren. Ebenso lassen sich auf diese Weise redundante Zugriffe eliminieren. Sobald ein Objekt zwei- oder mehrfach in der Antwort des Servers auftaucht, ist nur ein einmaliges Laden erforderlich.

Zu berĂŒcksichtigen ist, dass es auch im Falle einer entsprechenden Performance-Optimierung bei aufwendigen Anfragen zu einem Time-out im Rahmen der Verarbeitung kommen kann. Ein Lösungsansatz besteht darin, solche Anfragen bereits vor der AusfĂŒhrung im Hinblick auf ihren Aufwand zu beurteilen und gegebenenfalls zurĂŒckzuweisen.


Sie haben noch Fragen?

Kontaktieren Sie uns

Kostenloser SEO-Check der OSG


Weitere Inhalte