API auf Java: REST, GraphQL, gRPC — was wählt man 2025?

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: Die Evolution von APIs in Java

\n\n

Die 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\n

In 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\n

Lasst uns herausfinden, welches Protokoll euren Code schneller und euer Leben einfacher macht.

\n\n

REST API in Java: Ein Klassiker, der nie stirbt

\n\n

REST (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\n

Beispiel: Liste der Kurse abrufen

\n\n

Angenommen, 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\n

Der 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\n

Vorteile 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
\n\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
\n\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\n

GraphQL in Java: Gib mir nur das, was ich verlange

\n\n

GraphQL 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\n

Der 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\n

Beispiel: GraphQL-Schema und Resolver

\n\n

Schema definieren:

\n\n
type Course {\n    id: ID!\n    title: String!\n    author: String!\n    progress(studentId: ID!): Int\n}\n\ntype Query {\n    courses: [Course!]!\n}
\n\n

Resolver 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\n

Anfrage vom Client:

\n\n
query {\n  courses {\n    title\n                

Blogs

Buchempfehlungen