Was ist GraphQL? - Eine umfassende Einführung und Vergleich mit REST

GraphQL - Einführung und Vergleich mit REST - Anwendungsfälle.

 

Jochen Möller
Jochen Möller
07.03.2023

Autor: Jochen Möller (Geschäftsführer und CoFounder von EcholoN) - Erstellung: 07.03.2023, letzte Änderung: 28.03.2024

Willkommen zu unserem umfassenden Artikel über GraphQL! In diesem Artikel werden wir die Grundlagen von GraphQL erklären und es mit REST vergleichen. GraphQL ist eine moderne Abfragesprache für APIs, die von Facebook entwickelt wurde. Es bietet viele Vorteile gegenüber herkömmlichen REST APIs und wird von Entwicklern auf der ganzen Welt immer häufiger eingesetzt.

Was ist GraphQL?

Eine moderne Abfragesprache für APIs

GraphQL ist eine moderne Abfragesprache für APIs. Es wurde 2012 von Facebook entwickelt und ermöglicht es Entwicklern, effizienter auf Daten zuzugreifen und nur die benötigten Daten abzurufen. Im Gegensatz zu REST, bei dem mehrere Endpunkte existieren können, hat GraphQL einen einzigen Endpunkt, über den alle Abfragen abgerufen werden können.

Vergleich mit REST APIs

Im Vergleich zu REST APIs bietet GraphQL einige Vorteile. Während bei REST APIs oft Overfetching oder Underfetching von Daten auftritt, ermöglicht GraphQL eine präzise Abfrage und Rückgabe von Daten. Mit GraphQL können Entwickler genau angeben, welche Daten sie benötigen, und erhalten nur diese Daten zurück. Dies führt zu effizienter Datenmanipulation und einer optimierten Datenabfrage.

Vorteile von GraphQL

GraphQL bietet viele Vorteile gegenüber REST APIs. Es ermöglicht eine effiziente Datenabfrage, da nur die benötigten Daten abgefragt werden. Außerdem ist GraphQL sehr flexibel und erlaubt es Entwicklern, komplexe Abfragen mit nur einer einzigen Anfrage zu erstellen. Darüber hinaus unterstützt GraphQL verschiedene Programmiersprachen wie Javascript, Python und Ruby. Es gibt auch eine aktive Community, die GraphQL unterstützt und weiterentwickelt, wie die GraphQL Foundation.

Wie funktioniert GraphQL?

GraphQL Schema und Typsystem

Das Herzstück von GraphQL ist das Schema. Das Schema definiert die Struktur der Daten und die möglichen Abfragen, die gestellt werden können. Das Typsystem von GraphQL ermöglicht es Entwicklern, klare und verständliche API-Schnittstellen zu erstellen. Die Daten werden in Form von Objekten und Feldern definiert, die wiederum miteinander verknüpft werden können.

GraphQL Syntax und Abfragesprache

Die Syntax von GraphQL ähnelt der von JSON. Abfragen werden in Form von sogenannten "Queries" gestellt. Eine GraphQL-Abfrage definiert die gewünschten Daten und ihre Struktur. Es ist auch möglich, Variablen in Abfragen zu verwenden, um die Flexibilität weiter zu erhöhen. Mit GraphQL können Daten auch mutiert werden, indem sie über sogenannte "Mutations" geändert, hinzugefügt oder gelöscht werden. Subscriptions ermöglichen es, ähnlich wie WebSockets, Echtzeit-Updates zu erhalten, indem sie einen permanenten Verbindungskanal zwischen Client und Server aufbauen.

GraphQL Clients und Endpunkte

Um mit GraphQL zu arbeiten, benötigt man einen GraphQL-Client. Ein GraphQL-Client ist eine Softwarebibliothek, mit der Abfragen an eine GraphQL-API gesendet werden können. Der Client übernimmt die Kommunikation mit dem GraphQL-Server und verarbeitet die Abfragen und Antworten. GraphQL unterstützt mehrere Endpunkte, was es Entwicklern ermöglicht, verschiedene Funktionen innerhalb einer Anwendung zu haben.

Warum ist GraphQL effizient?

Reduzierte Overfetching und Underfetching

Eines der Hauptprobleme bei REST APIs ist Overfetching oder Underfetching von Daten. Overfetching tritt auf, wenn mehr Daten abgerufen werden als benötigt, während Underfetching bedeutet, dass nicht genügend Daten abgerufen werden. Mit GraphQL können Entwickler genau angeben, welche Daten sie benötigen, und erhalten nur diese Daten zurück. Dadurch wird Overfetching und Underfetching eliminiert und die Effizienz der Abfragen verbessert.

Effiziente Datenmanipulation mit GraphQL

GraphQL ermöglicht nicht nur eine effiziente Abfrage von Daten, sondern auch eine effiziente Datenmanipulation. Mit GraphQL können Daten durch sogenannte "Mutations" bearbeitet oder hinzugefügt werden. Entwickler können genau spezifizieren, welche Änderungen vorgenommen werden sollen, und erhalten nur die relevanten Informationen zurück.

Optimierte Datenabfrage mit GraphQL

GraphQL ermöglicht eine optimierte Datenabfrage, da nur die benötigten Daten abgerufen werden. Dadurch entfällt das lästige Durchsuchen von ungenutzten Daten. Außerdem können Entwickler komplexe Abfragen mit nur einer einzigen Anfrage erstellen, was zu einer verbesserten Performance führt. Diese Flexibilität ermöglicht es den Entwicklern auch, die Datenabfrage zu optimieren und die Antwortzeit zu verbessern.

GraphQL vs. REST: Welches ist besser?

Vergleich der Programmiersprachen für GraphQL und REST

GraphQL wird durch verschiedene Programmiersprachen wie JavaScript, Python und Ruby unterstützt. REST wird durch die lange Marktzugehörigkeit auch durch verschiedenste  Programmiersprachen unterstützt. Entwickler können die Sprache wählen, die am besten zu ihrer Anwendung passt.

Unterschiede im Datenabfrageprozess

Der Datenabfrageprozess unterscheidet sich stark zwischen GraphQL und REST. Bei REST müssen Entwickler mehrere Endpunkte aufrufen, um alle benötigten Daten abzurufen. Mit GraphQL kann alles in einer einzigen Abfrage abgerufen werden, was die Effizienz verbessert und den Datenverkehr reduziert.

Vergleich der Entwicklerfreundlichkeit

Sowohl GraphQL als auch REST haben ihre Vor- und Nachteile in Bezug auf die Entwicklerfreundlichkeit. GraphQL bietet eine klare und verständliche API-Schnittstelle, während REST mehr Freiheit bei der Gestaltung der API bietet. Die Wahl zwischen GraphQL und REST hängt von den Anforderungen des Projekts und den Präferenzen der Entwickler ab.

Welche Risiken gibt es bei der Anwendung von GraphQL zum Datenaustausch

Die Verwendung von GraphQL zur Datenübertragung bietet viele Vorteile, birgt jedoch auch einige Risiken und Herausforderungen, die bei der Entwicklung und Implementierung berücksichtigt werden sollten.
Hier sind einige der Risiken im Zusammenhang mit der Anwendung von GraphQL:

Overfetching und Underfetching:

  • Während GraphQL das Problem von Overfetching (zu viele Daten abrufen) und Underfetching (nicht genug Daten abrufen) angeht, besteht die Gefahr, dass Entwickler trotzdem unzureichend optimierte Abfragen erstellen. Dies kann zu einer ineffizienten Nutzung der Ressourcen führen und die Leistung beeinträchtigen.

Komplexe Abfragen:

  • Da GraphQL es Clients ermöglicht, sehr komplexe Abfragen zu erstellen, besteht das Risiko, dass Abfragen zu komplex werden und unnötig viele Daten abrufen. Dies kann die Serverbelastung erhöhen und die Leistung beeinträchtigen.

Sicherheitsrisiken:

  • Unzureichend abgesicherte GraphQL-Server können anfällig für Sicherheitsangriffe sein. Beispielsweise könnten böswillige Clients versuchen, exzessive Abfragen oder Denial-of-Service-Angriffe durchzuführen. Es ist wichtig, Abfragegrenzen und Sicherheitsmechanismen zu implementieren, um solche Angriffe zu verhindern.( reverse Proxy / Firewall / Sicherheitssoftware)

Datenbankperformance:

  • Wenn GraphQL-Abfragen direkt auf Datenbanken abgebildet werden, ohne angemessene Optimierung, könnten ineffiziente Abfragen und komplexe Beziehungen die Datenbankleistung beeinträchtigen.

Datenexposition und Datenschutz:

  • GraphQL ermöglicht es Clients, genau die Daten anzufordern, die sie benötigen. Dies kann dazu führen, dass sensible Daten versehentlich exponiert werden, wenn die Zugriffssteuerung nicht ordnungsgemäß implementiert ist. Datenschutz und Zugriffskontrolle sollten sorgfältig berücksichtigt werden. Durch die Verwendung der Privilegien ist innerhalb von EcholoN die Trennung einstellbar.

Dokumentation und Schulung:

  • Da GraphQL-APIs flexibel und stark typisiert sind, erfordert ihre Nutzung eine gute Dokumentation und Schulung für Entwickler, um sicherzustellen, dass sie die API effektiv und sicher nutzen können.
    Die meisten dieser Risiken können mit sorgfältiger Planung, Implementierung und Überwachung adressiert werden. Es ist wichtig, bewährte Sicherheitspraktiken zu verwenden, die Leistung zu optimieren und die API-Dokumentation aktuell zu halten, um die Vorteile von GraphQL effektiv nutzen zu können.

Praktischer Einsatz von GraphQL

GraphQL-API in einer JavaScript-Anwendung

Um GraphQL in einer JavaScript-Anwendung zu verwenden, benötigt man einen GraphQL-Client wie Apollo Client oder Relay. Diese Clients ermöglichen die Kommunikation mit der GraphQL-API und das Senden von Abfragen und Mutationen. Mit GraphQL können Entwickler präzise Abfragen erstellen und nur die benötigten Daten abrufen.

Integration von GraphQL in eine Cloud-Umgebung

GraphQL kann auch in eine Cloud-Umgebung integriert werden. Cloud-Hosting-Plattformen wie AWS und Heroku bieten Unterstützung für GraphQL-Anwendungen. Entwickler können ihre GraphQL-APIs in der Cloud hosten und von den Vorteilen einer skalierbaren und zuverlässigen Infrastruktur profitieren.

Anforderung und Rückgabe von Daten mit GraphQL

Mit GraphQL können Entwickler genau spezifizieren, welche Daten sie benötigen, und erhalten nur diese Daten zurück. Dies ermöglicht eine effiziente Datenabfrage und reduziert den Datenverkehr. Entwickler können auch komplexe Abfragen mit nur einer einzigen Anfrage erstellen, was zu einer verbesserten Performance führt.

 

Anwendungsbereiche:

  1. APIs für mobile Apps und Webanwendungen: GraphQL eignet sich besonders gut für Anwendungen, die unterschiedliche Datenanforderungen haben, da Clients nur die Daten abrufen können, die sie tatsächlich benötigen. Dies trägt dazu bei, die Leistung der Anwendungen zu optimieren.

  2. Entwicklungsprozesse: GraphQL erleichtert die Zusammenarbeit zwischen Frontend- und Backend-Entwicklern, da beide Teams unabhängig voneinander arbeiten können. Frontend-Entwickler können die Datenanforderungen direkt in ihren Abfragen definieren, ohne auf Backend-Änderungen warten zu müssen.

  3. Datenzusammenführung (Data Stitching): Mit GraphQL können Daten aus verschiedenen Quellen, wie Datenbanken, RESTful APIs und Microservices, in einer einzigen Abfrage zusammengeführt werden. Dies ermöglicht es, einheitliche Schnittstellen für komplexe Systeme zu erstellen.

  4. Realtime-Webanwendungen: GraphQL kann mit WebSockets oder anderen Echtzeittechnologien integriert werden, um Echtzeitaktualisierungen in Webanwendungen zu ermöglichen, beispielsweise in sozialen Netzwerken oder Chat-Anwendungen.

  5. Prototyping und Experimentieren: GraphQL erleichtert das Prototyping von API-Endpunkten und das Experimentieren mit neuen Funktionen, da Entwickler problemlos neue Felder und Abfragen hinzufügen können, ohne die bestehende API zu beeinträchtigen.

  6. Client-Bibliotheken: Es gibt zahlreiche Client-Bibliotheken für verschiedene Plattformen und Programmiersprachen, die die Verwendung von GraphQL in Anwendungen erleichtern.
    Insgesamt bietet GraphQL eine effiziente Möglichkeit, Daten zwischen Clients und Servern auszutauschen und ermöglicht eine höhere Flexibilität und Kontrolle über die abgerufenen Daten, was insbesondere in modernen Web- und Mobilanwendungen von Vorteil ist.

Beispiel GraphQL Abfrage der EcholoN-API

Die EcholoN-API verwendet GraphQL, um Abfragen und Mutationen durchzuführen. Mit Queries können Informationen von der Datenbank abgerufen werden. Dabei können spezifische Felder definiert werden, um nur die erforderlichen Daten zu erhalten. Dies trägt dazu bei, die Effizienz der Abfragen zu maximieren und den Netzwerkverkehr zu minimieren. Auf der anderen Seite ermöglichen Mutations das Ändern von Daten in der Datenbank. Dadurch können Benutzer neue Daten erstellen, vorhandene Daten aktualisieren oder sogar löschen. So können dann z.B. Prozesse-Vorlagen mit Workflows und / oder Tätigkeitsmuster in der Workflow-Engine angesprochen werden. Subscriptions erlauben es, ähnlich wie WebSockets, aktuelle Informationen in Echtzeit zu erhalten, indem sie einen dauerhaften Verbindungskanal zwischen dem Client und dem Server herstellen. Durch die Verwendung von GraphQL in der EcholoN-API wird die Flexibilität und Leistungsfähigkeit des Systems verbessert. 

View query

{
  views {
    incidents(skip: 2, first: 2, orderBy: ["number_asc"]) {
      id {
        entityId
        itemId
      }
      number
      name
    }
  }
}

Antwort

{
  "data": {
    "views": {
      "incidents": [
        {
          "id": {
            "entityId": "81986bf1-6e94-405d-b9c3-2a2eeb691d88",
            "itemId": "39574653-eb5b-4276-a165-108953db1b08"
          },
          "number": "IM-000002",
          "name": "Monitor flackert"
        },
        {
          "id": {
            "entityId": "81986bf1-6e94-405d-b9c3-2a2eeb691d88",
            "itemId": "8956c73f-f91b-4234-9750-5785b52fda2e"
          },
          "number": "IM-000009",
          "name": "Drucker druckt nicht "
        }
      ]
    }
  }
}

Mutation

mutation {
  working {
    enqueueChangeTargetDate {
      latest(
        input: {items: [
          {reference: "myref1", identity: {entityId: "81986bf1-6e94-405d-b9c3-2a2eeb691d88", itemId: "9e1c3a25-1d7e-44ad-871f-f76750360fa7"}}],
          title: "Change Date",
          workedOn: "2023-09-06T11:00:00.000Z",
          data: {targetDate: "2023-12-27T11:00:00.000Z"}}
      ) {
        id
        number
        reference
        statusCode
      }
    }
  }
}

Antwort

{
  "data": {
    "working": {
      "enqueueChangeTargetDate": {
        "latest": [
          {
            "id": "c03d5902-4456-4e6b-8bcd-06643f4df6aa",
            "number": 0,
            "reference": "myref1",
            "statusCode": "Pending"
          }
        ]
      }
    }
  }
}

 

Vielleicht auch noch interessant: