GraphQL war nie falsch. REST war nie obsolet. tRPC ist auch nicht die endgültige Antwort. Jede dieser Ansätze löst ein anderes Koordinationsproblem, und die richtige Wahl hängt mehr von Teamgrenzen und Konsumenten als von Stilvorlieben ab.
Worauf Jeder Ansatz Optimiert
REST ist stark, wenn Kompatibilität und HTTP-Semantik wichtig sind. Es funktioniert gut für öffentliche APIs, Drittanbieter und Systeme, bei denen der Transportvertrag sprachunabhängig bleiben sollte.
GraphQL ist stark, wenn viele Clients flexible Abfragen gegen ein gemeinsames Schema benötigen. Es zentralisiert den Vertrag und gibt den Clients Kontrolle über die Struktur, was wertvoll ist, wenn die Anforderungen des Frontends variieren.
tRPC ist am stärksten, wenn ein TypeScript-Team beide Enden besitzt und eine schnelle, typensichere Iteration wünscht:
export const appRouter = router({
getUser: publicProcedure
.input(z.object({ id: z.string() }))
.query(({ input }) => db.user.findUnique({ where: { id: input.id } })),
});
Das ist mächtig, setzt jedoch ein relativ enges Kopplungsmodell voraus.
Der Echte Kompromiss
Jeder Stil verlagert die Komplexität irgendwohin:
- REST verschiebt mehr Strukturkomposition zu den Clients
- GraphQL fügt Schema-Governance und Resolver-Disziplin hinzu
- tRPC bindet Sie enger an TypeScript und interne Eigentumsgrenzen
Deshalb ist der API-Stil keine Ideologie. Es ist eine organisatorische Designentscheidung.
Besserer Grundsatz
Wählen Sie basierend auf den Konsumenten:
- öffentlich, breit, sprachunabhängig: REST
- viele Client-Strukturen, ein zentrales Schema: GraphQL
- einzelne TypeScript-Organisationsgrenzen, schnelle interne Iteration: tRPC
Der falsche Schritt ist, einen Stil überall zu verwenden, nur um konsistent zu wirken.
Weiterführende Literatur