Einleitung: Die Evolution von APIs in Java
\n\nDie Welt der Java-Entwicklung steht nicht still. Noch vor 10 Jahren war die Wahl klar: REST und JSON. Heute jedoch, beim Entwurf einer Microservice-Architektur oder einer mobilen App, steht der Entwickler vor einem ganzen Zoo von Protokollen. REST, GraphQL, gRPC – jedes verspricht paradiesische Zustände, aber in der Realität stecken hinter jeder Technologie Kompromisse.
\n\nIn diesem Artikel werden wir nicht die Dokumentation nacherzählen. Wir nehmen eine reale Aufgabe: Wir müssen eine API für eine Bildungsplattform erstellen (wie unsere PythonLib, nur in Java). Wir haben Kurse, Studenten und Lernfortschritte. Und wir werden versuchen, denselben Endpunkt auf drei verschiedene Arten zu implementieren.
\n\nLasst uns herausfinden, welches Protokoll euren Code schneller und euer Leben einfacher macht.
\n\nREST API in Java: Ein Klassiker, der nie stirbt
\n\nREST (Representational State Transfer) ist ein Architekturstil, kein Protokoll. In Java ist der De-facto-Standard für REST Spring Boot mit seinen Annotationen. Einfachheit, Verständlichkeit, eine riesige Community – das ist es, warum wir REST lieben.
\n\nBeispiel: Liste der Kurse abrufen
\n\nAngenommen, wir müssen dem Client eine Liste aller Kurse mit Basisinformationen ausliefern:
\n\n@RestController\n@RequestMapping("/api/courses")\npublic class CourseController {\n\n @GetMapping\n public ResponseEntity<List<CourseDTO>> getAllCourses() {\n List<Course> courses = courseService.findAll();\n List<CourseDTO> dtos = courses.stream()\n .map(c -> new CourseDTO(c.getId(), c.getTitle(), c.getAuthor()))\n .toList();\n return ResponseEntity.ok(dtos);\n }\n}\n\nDer Client erhält JSON:
\n\n[\n {"id": 1, "title": "Java für Anfänger", "author": "Ivan Petrov"},\n {"id": 2, "title": "Spring Boot Masterclass", "author": "Anna Smirnova"}\n]\n\nVorteile von REST in Java:
\n- \n
- Minimale Einstiegshürde – jeder Java-Entwickler kennt Spring. \n
- Caching über HTTP-Header (ETag, Cache-Control). \n
- Breite Unterstützung durch Tools (Postman, Swagger, OpenAPI). \n
Nachteile:
\n- \n
- Problem des Over-fetching (überflüssige Daten) und Under-fetching (nicht genug Daten, mehrere Anfragen nötig). \n
- Schwache Typisierung – alles hängt vom Vertrag ab, der leicht verletzt werden kann. \n
REST ist ideal für öffentliche APIs, wenn die Clients Dritte sind und Sie maximale Kompatibilität benötigen. Aber wenn Ihr Client eine mobile App ist, die genau das erhalten möchte, was sie braucht, wird REST schnell lästig.
\n\nGraphQL in Java: Gib mir nur das, was ich verlange
\n\nGraphQL ist eine von Facebook entwickelte Abfragesprache. In Java wird es meistens über die Bibliothek graphql-java oder die Integration mit Spring – GraphQL Kickstart – implementiert.
\n\nDer Client entscheidet selbst, welche Felder er benötigt. Kein Over-fetching. Eine einzige Anfrage – und du erhältst die Kurse zusammen mit dem Fortschritt des Studenten.
\n\nBeispiel: GraphQL-Schema und Resolver
\n\nSchema definieren:
\n\ntype Course {\n id: ID!\n title: String!\n author: String!\n progress(studentId: ID!): Int\n}\n\ntype Query {\n courses: [Course!]!\n}\n\nResolver in Java schreiben:
\n\n@Component\npublic class CourseResolver implements GraphQLQueryResolver {\n\n @Autowired\n private CourseService courseService;\n\n public List<Course> courses() {\n return courseService.findAll();\n }\n}\n\n@Component\npublic class CourseFieldResolver implements GraphQLResolver<Course> {\n\n @Autowired\n private ProgressService progressService;\n\n public Integer progress(Course course, Long studentId) {\n return progressService.getProgress(course.getId(), studentId);\n }\n}\n\nAnfrage vom Client:
\n\nquery {\n courses {\n title\n