Introduction aux services web #
Les services web sont des applications ou des ressources accessibles via Internet qui permettent à des programmes (clients) de communiquer avec des serveurs distants pour échanger des données ou exécuter des fonctionnalités. Ils reposent principalement sur le protocole HTTP (HyperText Transfer Protocol), un protocole de communication client-serveur sans état : chaque requête est traitée indépendamment, sans mémoire des échanges précédents. Un client envoie une requête comportant une méthode (comme GET ou POST), une adresse (URI), des en-têtes et éventuellement un corps, tandis que le serveur répond avec un code de statut, des en-têtes et un corps contenant les données demandées.
Dans le contexte moderne, la grande majorité des services web sont des API (interfaces de programmation applicatives) qui exposent des fonctionnalités sous forme de points d’accès (endpoints). Ces API permettent à une application Java, par exemple, de récupérer des informations (prévisions météo, profils utilisateurs) ou d’envoyer des données (création de ressources) sans connaître les détails d’implémentation du serveur. Le format d’échange le plus répandu est JSON (JavaScript Object Notation), un format texte léger, lisible par l’homme et la machine, composé de paires clé-valeur, de tableaux et d’objets imbriqués. JSON est devenu le standard pour les services web car il est simple, flexible et supporté nativement par la plupart des langages.
Exemple de structure JSON typique renvoyée par un service web :
{
"nom": "Alice",
"age": 30,
"estEtudiant": false,
"competences": ["Java", "HTML", "JavaScript"]
}
Exemple avec l’API Open-Meteo (requête GET et traitement JSON manuel) #
Le programme suivant récupère et affiche les prévisions météo horaires pour Montréal en interrogeant l’API Open-Meteo. Il illustre l’utilisation de l’API HttpClient, la construction d’une requête GET, la gestion des réponses JSON de manière manuelle (sans bibliothèque externe), ainsi que le traitement des dates avec java.time.
Ce programme Java récupère les prévisions météo horaires pour Montréal en interrogeant l’API publique Open-Meteo via une requête HTTP GET construite avec l’API HttpClient de Java 11. Il définit d’abord les coordonnées géographiques de la ville et assemble l’URL de requête demandant spécifiquement les températures à 2 mètres et les précipitations. Dans un bloc try-catch pour gérer les erreurs réseau ou de traitement, il crée un client HTTP, bâtit et envoie la requête, puis récupère la réponse sous forme de chaîne JSON. Le parsing du JSON est réalisé manuellement : une sous-chaîne isole la section “hourly”, et une méthode auxiliaire extractArray extrait les tableaux correspondants aux horaires, températures et précipitations en repérant les crochets. Les dates au format ISO sont ensuite parsées avec DateTimeFormatter pour comparer chaque prévision à l’heure actuelle (via LocalDateTime.now()), filtrant ainsi les entrées futures. Enfin, une boucle affiche les 12 prochaines heures valides au format lisible, avec température en degrés Celsius et précipitations en millimètres, en nettoyant les chaînes pour convertir les valeurs numériques.
Exemple avec l’API Open-Meteo (requête GET et traitement JSON avec Jackson) #
Le programme suivant récupère et affiche les prévisions météo horaires pour Montréal en interrogeant l’API Open-Meteo. Contrairement à la version manuelle, il utilise la bibliothèque Jackson pour parser la réponse JSON de manière robuste et structurée. Jackson permet de mapper directement le JSON vers des classes Java dédiées, évitant ainsi le parsing fragile basé sur des chaînes de caractères. Cela rend le code plus lisible, plus maintenable et moins sujet aux erreurs en cas de modifications mineures dans la structure du JSON.
Pour utiliser Jackson, ajoutez la dépendance suivante à votre projet (par exemple via Maven) :
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
Le programme définit deux classes internes : Hourly pour représenter la section “hourly” contenant les listes de données, et ForecastResponse pour l’objet racine de la réponse. Jackson désérialise automatiquement les tableaux en listes Java, et nous pouvons ensuite itérer facilement sur les données synchronisées (les indices correspondent entre time, temperature_2m et precipitation).
Cette approche avec Jackson est nettement plus élégante que le parsing manuel : elle gère automatiquement les structures imbriquées et les tableaux, tolère mieux les champs supplémentaires dans le JSON, et facilite l’extension du programme (par exemple, ajouter d’autres variables météo). En production, il est recommandé d’utiliser une bibliothèque comme Jackson ou Gson plutôt qu’un parsing texte maison.
Exemple avec requêtes GET et POST (HttpClientExample) #
Ce second programme montre deux usages classiques : une requête GET pour récupérer des données publiques depuis l’API GitHub, et une requête POST pour simuler l’envoi de données JSON vers une API de test. Il met en évidence la construction des en-têtes, du corps de requête et la gestion des réponses.
Ce programme Java démontre l’utilisation de l’API HttpClient introduite en Java 11 pour effectuer des requêtes HTTP synchrones, en illustrant deux méthodes courantes : GET pour récupérer des données et POST pour en envoyer. Il commence par créer un client HTTP configurable via HttpClient.newBuilder(), ici avec les paramètres par défaut. Dans un bloc try-catch capturant les exceptions potentielles (erreurs réseau, interruptions ou problèmes de réponse), il construit et envoie d’abord une requête GET vers l’API GitHub pour obtenir les informations publiques de l’utilisateur “octocat”, en spécifiant l’en-tête “Accept: application/json” pour demander une réponse au format JSON ; le code de statut (généralement 200 en cas de succès) et le corps de la réponse (un objet JSON décrivant l’utilisateur) sont ensuite affichés. La seconde partie concerne une requête POST vers l’API de test jsonplaceholder.typicode.com, où un corps JSON simple est préparé comme payload, encodé en UTF-8, et envoyé avec l’en-tête “Content-Type: application/json” pour indiquer le format des données ; le serveur simule la création d’une ressource et renvoie un code de statut (typiquement 201 pour création) accompagné d’un corps JSON enrichi (par exemple avec un ID généré), qui est également affiché. Ce code met en évidence la simplicité de construction des requêtes (via un builder), la gestion des en-têtes et du corps, ainsi que le traitement basique des réponses, tout en soulignant l’importance de la gestion d’exceptions dans les communications réseau.