GraphQL vs REST in PHP: Was für APIs im Jahr 2024 wählen?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: REST oder GraphQL – der ewige Kampf um Geschwindigkeit und Flexibilität

\n

Hallo Entwickler! Wenn du jemals eine API in PHP geschrieben hast, bist du sicherlich auf das Dilemma gestoßen: Verwende ich das klassische REST oder das moderne GraphQL? Beide Ansätze lösen die gleiche Aufgabe – die Datenübertragung zwischen Client und Server –, aber sie tun dies auf grundlegend unterschiedliche Weise.

\n

REST war lange Jahre der De-facto-Standard: einfach, verständlich, vorhersagbar. Aber mit der zunehmenden Komplexität von Frontends (React, Vue, mobile Apps) beschweren sich Entwickler immer häufiger über Overfetching (zu viele Daten in der Antwort) und Underfetching (mehrere Anfragen nötig, um die benötigten Informationen zu sammeln). Hier kommt GraphQL ins Spiel – eine Abfragesprache, die dem Client die Kontrolle darüber gibt, welche Daten genau abgerufen werden.

\n

In diesem Artikel werden wir nicht nur die Theorie auflisten. Wir nehmen reale PHP-Projekte (Laravel und Symfony), schreiben Code und schauen, was schneller und was bequemer ist. Los geht's!

\n\n

1. REST API in PHP: Ein Klassiker, der nicht stirbt

\n

Wie es funktioniert

\n

REST (Representational State Transfer) ist ein Architekturstil, bei dem jede Ressource (Benutzer, Artikel, Kommentar) ihre eigene URL hat. Der Client sendet HTTP-Anfragen (GET, POST, PUT, DELETE) und der Server gibt eine feste Datenstruktur zurück, normalerweise im JSON-Format.

\n

Beispiel eines typischen REST-Endpunkts in PHP (ohne Framework):

\n
// index.php - einfache REST API\nheader('Content-Type: application/json');\n\n$method = $_SERVER['REQUEST_METHOD'];\n$uri = $_SERVER['REQUEST_URI'];\n\nif ($method === 'GET' && $uri === '/api/users') {\n    $users = [\n        ['id' => 1, 'name' => 'Alexej', 'email' => 'alex@example.com'],\n        ['id' => 2, 'name' => 'Maria', 'email' => 'maria@example.com']\n    ];\n    echo json_encode($users);\n}\n
\n

In Laravel sieht das noch einfacher aus:

\n
// routes/api.php\nRoute::get('/users', function () {\n    return User::all(); // Wird automatisch in JSON serialisiert\n});\n
\n

Vorteile von REST

\n
    \n
  • Einfaches Caching: HTTP-Caching (ETag, Last-Modified) funktioniert out-of-the-box.
  • \n
  • Einfache Fehlersuche: Jeder Browser oder curl zeigt die Antwort an.
  • \n
  • Stabilität: REST existiert seit dem Jahr 2000, Dokumentation und Tools (Postman, Swagger) sind bis zur Perfektion verfeinert.
  • \n
\n

Nachteile von REST

\n
    \n
  • Overfetching: Wenn der Client nur den Benutzernamen benötigt, erhält er trotzdem E-Mail, Telefon und Adresse.
  • \n
  • N+1-Problem: Um einen Benutzer und seine Beiträge zu erhalten, sind zwei Anfragen nötig (GET /users/1, GET /users/1/posts).
  • \n
\n\n

2. GraphQL in PHP: Wenn der Client König ist

\n

Wie es funktioniert

\n

GraphQL ist keine Datenbank, sondern eine Schicht zwischen Client und Server. Der Client sendet eine POST-Anfrage an einen einzigen Endpunkt (normalerweise /graphql) mit einem Anfragekörper, in dem er beschreibt, welche Felder und Beziehungen benötigt werden. Der Server gibt genau das zurück, was angefordert wurde – kein Byte mehr.

\n

Beispiel einer Implementierung in PHP mit der Bibliothek webonyx/graphql-php:

\n
// schema.php\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\n\n$userType = new ObjectType([\n    'name' => 'User',\n    'fields' => [\n        'id' => Type::int(),\n        'name' => Type::string(),\n        'email' => Type::string(),\n    ]\n]);\n\n$queryType = new ObjectType([\n    'name' => 'Query',\n    'fields' => [\n        'user' => [\n            'type' => $userType,\n            'args' => ['id' => Type::int()],\n            'resolve' => function ($root, $args) {\n                return findUserById($args['id']); // Ihre Logik\n            }\n        ]\n    ]\n]);\n
\n

Und nun die Anfrage vom Client:

\n
// Anf                

Blogs

Buchempfehlungen