Introduction : l'évolution des API en Java
\n\nLe monde du développement Java ne s'arrête pas. Il y a encore 10 ans, le choix était évident : REST et JSON. Aujourd'hui, en concevant une architecture de microservices ou une application mobile, le développeur se retrouve face à tout un zoo de protocoles. REST, GraphQL, gRPC — chacun promet des paradis, mais en réalité, chaque technologie comporte des compromis.
\n\nDans cet article, nous ne allons pas répéter la documentation. Nous allons prendre un problème concret : nous devons créer une API pour une plateforme éducative (comme notre PythonLib, mais en Java). Nous avons des cours, des étudiants et la progression de l'apprentissage. Et nous allons essayer d'implémenter le même endpoint de trois manières différentes.
\n\nC'est parti pour déterminer quel protocole rendra votre code plus rapide et votre vie plus facile.
\n\nAPI REST en Java : un classique qui ne meurt pas
\n\nREST (Representational State Transfer) est un style architectural, pas un protocole. En Java, le standard de facto pour REST est Spring Boot avec ses annotations. Simplicité, clarté, une immense communauté — voilà pourquoi nous aimons REST.
\n\nExemple : obtenir la liste des cours
\n\nSupposons que nous devions fournir au client une liste de tous les cours avec des informations de base :
\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\nLe client reçoit du JSON :
\n\n[\n {"id": 1, "title": "Java pour débutants", "author": "Ivan Petrov"},\n {"id": 2, "title": "Spring Boot Masterclass", "author": "Anna Smirnova"}\n]\n\nAvantages de REST en Java :
\n- \n
- Seuil d'entrée minimal — tout développeur Java connaît Spring. \n
- Mise en cache via les en-têtes HTTP (ETag, Cache-Control). \n
- Large support d'outils (Postman, Swagger, OpenAPI). \n
Inconvénients :
\n- \n
- Problème de sur-récupération (over-fetching) et de sous-récupération (under-fetching) des données. \n
- Typage faible — tout repose sur un contrat facile à violer. \n
REST est idéal pour les API publiques, lorsque les clients sont des tiers et que vous avez besoin d'une compatibilité maximale. Mais si votre client est une application mobile qui souhaite recevoir exactement ce dont elle a besoin, REST commence à agacer.
\n\nGraphQL en Java : donnez-moi seulement ce que je demande
\n\nGraphQL est un langage de requêtes créé par Facebook. En Java, il est le plus souvent implémenté via la bibliothèque graphql-java ou l'intégration avec Spring — GraphQL Kickstart.
\n\nLe client décide lui-même des champs dont il a besoin. Pas de sur-récupération. Une seule requête — et vous obtenez les cours ainsi que la progression de l'étudiant.
\n\nExemple : schéma GraphQL et résolveur
\n\nNous définissons le schéma :
\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\nNous écrivons le résolveur en Java :
\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\nRequête du client :
\n\nquery {\n courses {\n title\n