time lapse photography of square containers at night

REST vs. GraphQL

In der weiten Landschaft der Webentwicklung haben sich zwei Superhelden herausgebildet, die um die Krone der API-Vorherrschaft kämpfen: REST und GraphQL. Aber keine Angst, liebe Entwickler, in diesem Blog werden wir den Kampf zwischen diesen beiden Konkurrenten aufschlüsseln und Ihnen dabei helfen, zu entscheiden, welche der beiden am besten zu Ihren Bedürfnissen passt. Stürzen wir uns in den Showdown von REST vs. GraphQL!

Runde 1: Einführung

REST (Representational State Transfer)
REST ist seit Jahren der amtierende Champion. Es stützt sich auf HTTP-Methoden zur Durchführung von Aktionen auf Ressourcen mit einfachen und vorhersehbaren Endpunkten. Jeder Endpunkt stellt eine Ressource dar, und CRUD-Vorgänge werden auf HTTP-Verben wie GET, POST, PUT und DELETE abgebildet.

GraphQL

GraphQL, der Herausforderer, kam mit einer neuen Perspektive. Es ermöglicht den Kunden, genau die Daten anzufordern, die sie benötigen, und nicht mehr oder weniger. Anstelle mehrerer Endpunkte bietet GraphQL einen einzigen Endpunkt für die Abfrage und Änderung von Daten. Dieser flexible und effiziente Ansatz hat schnell an Popularität gewonnen.

Runde 2: Data Fetching

REST

Bei REST führt das Abrufen von Daten oft zu einem Über- oder Unterabruf. Wenn Sie beispielsweise das Profil eines Benutzers abrufen, erhalten Sie möglicherweise mehr Daten, als Sie benötigen. Dies kann zu einer langsameren Leistung und einem höheren Datenverbrauch führen.

GraphQL

GraphQL vermeidet Über- und Unterabrufe. Kunden geben die Struktur und die Felder an, die sie in der Abfrage benötigen, was zu einem präzisen Datenabruf führt. Dies reduziert die Anzahl der Anfragen und optimiert den Datenabruf.

Beispiel (mit Node.js):
Stellen Sie sich vor, Sie wollen das Profil eines Benutzers und seine letzten Beiträge abrufen.

REST

GET /api/users/123
GET /api/users/123/posts

GraphQL

query {
  user(id: 123) {
    name
    email
    posts(last: 5) {
      title
      content
    }
  }
}

Runde 3: Performance

REST

Bei REST kann es zu einem Über- oder Unterabruf kommen, was die Leistung beeinträchtigt. Oft sind mehrere Anfragen erforderlich, um die erforderlichen Daten zusammenzustellen, was zu Verzögerungen führen kann.

GraphQL

Der Single-Request-Ansatz von GraphQL reduziert die Anzahl der Round-Trips zwischen dem Client und dem Server. Er ermöglicht es den Clients, alle benötigten Daten in einer einzigen Anfrage zu erhalten, was die Leistung verbessert.

lass uns anhand von Beispielen die Leistungsunterschiede zwischen REST und GraphQL in Bezug auf Überabrufe, Unterabrufe und die Anzahl der Roundtrips verdeutlichen.

Over-Fetching Beispiel

Stell dir vor, Du baust eine Blog-Anwendung und musst eine Liste von Blog-Beiträgen mit den Titeln und Namen der Autoren anzeigen.

REST

Für jeden Blogbeitrag kannst Du einen Endpunkt wie /api/posts haben, der den Titel des Beitrags, den Inhalt, die ID des Autors und mehr zurückgibt.

GET /api/posts

// Response for each post:
{
  "id": 1,
  "title": "Introduction to GraphQL",
  "content": "This is a blog post about GraphQL...",
  "authorId": 123,
  // other fields...
}

In diesem Fall werden zu viele Daten abgerufen, weil Sie die ID des Autors angefordert haben, obwohl Sie nur dessen Namen benötigen.

GraphQL

Mit GraphQL kannst Du genau die Daten abrufen, die Sie benötigen:

query {
  posts {
    title
    author {
      name
    }
  }
}

Hier werden nur die Titel der Beiträge und die Namen der Autoren abgerufen, um ein Überlesen zu vermeiden.

Beispiel für Under-fetching

Bleiben wir bei der Blog-Anwendung und nehmen wir an, Du möchtest das Profil eines Benutzers zusammen mit seinen letzten Blog-Beiträgen anzeigen.

REST

Um dies mit REST zu erreichen, könnten Sie zunächst das Profil des Benutzers abrufen und dann die letzten Beiträge separat abrufen:

GET /api/users/123
GET /api/users/123/posts

Dies führt dazu, dass zu wenig Daten abgerufen werden, weil bei der ersten Anfrage nicht alle benötigten Daten abgerufen wurden.

GraphQL

Mit GraphQL kannst Du in einer einzigen Abfrage sowohl das Profil des Nutzers als auch dessen letzte Beiträge abrufen:

query {
  user(id: 123) {
    name
    email
    posts(last: 5) {
      title
      content
    }
  }
}

Hier könntest Du alle benötigten Daten auf einmal abrufen, wodurch sich die Anzahl der Anfragen reduziert und der Datenabruf optimiert wird.

Anzahl der Roundtrips

Stell dir vor, Du entwickelst eine Social-Media-App und musst das Profil eines Nutzers, seine Beiträge und die Anzahl seiner Follower anzeigen.

REST

Bei REST benötigst du möglicherweise mehrere Anfragen, um alle erforderlichen Daten zu erhalten:

GET /api/users/123
GET /api/users/123/posts
GET /api/users/123/followers

Jede Anfrage führt zu einer Hin- und Rückreise zum Server, was zu Verzögerungen führen kann.

GraphQL

Der Single-Request-Ansatz von GraphQL hilft, Roundtrips zu reduzieren:

query {
  user(id: 123) {
    name
    posts {
      title
    }
    followers {
      count
    }
  }
}

Hier kannst Du das Profil, die Beiträge und die Anzahl der Follower des Nutzers in einer einzigen Abfrage erfassen, was die Anzahl der Roundtrips minimiert und die Leistung verbessert.

Sowohl in den Beispielen mit zu viel als auch mit zu wenig Abrufen erweist sich die Fähigkeit von GraphQL, präzise Daten in einer einzigen Abfrage anzufordern, als vorteilhaft. Außerdem trägt die reduzierte Anzahl von Roundtrips in GraphQL-Abfragen zu einer verbesserten Leistung im Vergleich zu den potenziell mehrfachen Anfragen der REST bei.

Runde 4: Versionierung

REST

Bei der Versionskontrolle in REST müssen häufig neue Endpunkte (z. B. /v1/users und /v2/users) erstellt werden, um Änderungen zu unterstützen. Dies kann zu Codeduplizierung und Wartungsproblemen führen.

GraphQL

GraphQL vermeidet Versionsprobleme, indem es Clients erlaubt, nur die erforderlichen Felder anzufordern. Wenn sich der Server weiterentwickelt, können die Clients neue Felder anfordern, ohne versionierte Endpunkte zu benötigen.

Stell dir also vor, Du entwickeln eine E-Commerce-Plattform und hast einen Endpunkt zum Abrufen von Produktdetails.

REST

Zunächst entwirfst Du einen REST-Endpunkt zum Abrufen von Produktdetails wie folgt:

GET /api/v1/products/123

Später beschließt Du, die Produktdetails um Kundenrezensionen zu erweitern. Du musst diese Änderung vornehmen und gleichzeitig die Abwärtskompatibilität für bestehende Kunden sicherstellen.

Versionierung in REST

Um die Änderung zu berücksichtigen und die Abwärtskompatibilität zu wahren, kannst Du einen neuen versionierten Endpunkt erstellen:

GET /api/v2/products/123

Dieser Ansatz führt zu einer Verdoppelung des Codes und zu Problemen bei der Wartung, da Du beide Versionen getrennt verwalten müssen.

GraphQL

Mit GraphQL wird die Versionierung zu einer anderen Geschichte. Da Kunden genau die Felder anfordern können, die sie benötigen, kannst Du neue Felder einführen, ohne bestehende Abfragen zu verändern.

Anfänglich könnte Deine GraphQL-Abfrage wie folgt aussehen:

query {
  product(id: 123) {
    name
    price
  }
}

Wenn es an der Zeit ist, dem Produkt Bewertungen hinzuzufügen, erweiterst Du einfach die Abfrage:

query {
  product(id: 123) {
    name
    price
    reviews {
      rating
      comment
    }
  }
}

Es besteht also keine Notwendigkeit für versionierte Endpunkte; Clients können sich an Änderungen anpassen, indem sie bei Bedarf die neuen Felder anfordern. Diese Flexibilität beseitigt die mit der Versionierung verbundenen Probleme, die bei REST auftreten.

Runde 5: Komplexe Beziehungen

REST

Der Umgang mit komplexen Beziehungen in REST kann zu einer Vermehrung von Endpunkten führen. Die Navigation in verschachtelten Ressourcen kann unübersichtlich werden.

GraphQL

GraphQL zeichnet sich durch den Umgang mit komplexen Beziehungen aus. Clients können tief verschachtelte Abfragen definieren, und der Server löst die Datenstruktur entsprechend auf.

Beispiel

Stell Dir vor, du baust eine Social-Networking-Plattform auf, auf der Nutzer Beiträge erstellen und gegenseitig kommentieren können.

REST

In einer RESTful-Konfiguration führt der Umgang mit komplexen Beziehungen oft zu einer Vielzahl von Endpunkten, und die Navigation in verschachtelten Ressourcen kann komplex werden.

Um beispielsweise die Beiträge eines Benutzers zusammen mit den Kommentaren zu jedem Beitrag abzurufen, musst Du möglicherweise mehrere Anfragen stellen:

Abrufen der Beiträge eines Benutzers:

GET /api/users/123/posts

Abruf der Kommentare für jeden Beitrag:

GET /api/posts/456/comments

Dieser Ansatz führt zu mehreren Anfragen und kann mit zunehmender Tiefe der Beziehungen mühsam werden.

GraphQL

Mit GraphQL wird der Umgang mit komplexen Beziehungen viel eleganter.

query {
  user(id: 123) {
    name
    posts {
      title
      comments {
        text
        author {
          name
        }
      }
    }
  }
}

In dieser einzigen GraphQL-Abfrage werden der Name eines Benutzers, seine Beiträge mit Titel und für jeden Beitrag der Kommentartext zusammen mit dem Namen des Autors abgefragt. Diese tiefe Verschachtelung ist in GraphQL mühelos möglich, und der Server löst die Datenstruktur wie angefordert auf.

Dieses Beispiel zeigt die Fähigkeit von GraphQL, Daten aus komplexen Beziehungen mit einer einzigen Abfrage zu navigieren und abzurufen. Bei solchen Szenarien entfällt die Notwendigkeit mehrerer Roundtrips und die mit REST verbundene Vervielfachung der Endpunkte.

Runde 6: Lernkurve

REST

Die Einfachheit von REST macht es leicht zu verstehen, besonders für Anfänger. Die Konzepte von Endpunkten und HTTP-Methoden sind den meisten Entwicklern vertraut.

GraphQL

GraphQL führt neue Konzepte wie Schemata und Resolver ein, die eine steilere Lernkurve haben können. Die Vorteile, die es bietet, können jedoch die anfänglichen Herausforderungen überwiegen.

type User {
  id: ID
  name: String
  playlists: [Playlist]
}

type Playlist {
  id: ID
  name: String
  tracks: [Track]
}

type Track {
  id: ID
  title: String
  artist: String
}

type Query {
  user(id: ID): User
}

type Mutation {
  createUser(name: String): User
}

Zusammenfassung

Im Kräftemessen zwischen REST und GraphQL gibt es keinen endgültigen Sieger. Die Wahl zwischen den beiden hängt von den Anforderungen, der Komplexität und den Leistungsüberlegungen Deines Projekts ab. REST bleibt eine solide Wahl für einfachere Anwendungen, während GraphQL in Szenarien glänzt, in denen Flexibilität und Effizienz an erster Stelle stehen.

Ob Du nun Veteranen REST oder den GraphQL-Neuling wählst, denk immer daran, dass beide ihre Stärken und Schwächen haben. Wähle also weise, und mögen Deine APIs immer effizient sein, und Deine Endpunkte immer RESTfull oder GraphQLish!