API en Java : REST, GraphQL, gRPC — que choisir en 2025 ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : l'évolution des API en Java

\n\n

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

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

C'est parti pour déterminer quel protocole rendra votre code plus rapide et votre vie plus facile.

\n\n

API REST en Java : un classique qui ne meurt pas

\n\n

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

Exemple : obtenir la liste des cours

\n\n

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

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

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

GraphQL en Java : donnez-moi seulement ce que je demande

\n\n

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

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

Exemple : schéma GraphQL et résolveur

\n\n

Nous définissons le schéma :

\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

Nous é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\n

Requête du client :

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

Blogs

Book Recommendations