Client HTTP en Java : effectuer des requêtes correctement
Dans le développement web moderne, presque aucune application ne peut fonctionner sans interagir avec des serveurs distants. Que ce soit pour l'intégration avec une API REST, le chargement de données ou la soumission de formulaires — la capacité à travailler correctement avec les requêtes HTTP en Java est une compétence obligatoire pour un développeur. Dans cet article, nous analyserons comment créer un client HTTP fiable en Java, en examinant les approches modernes et les meilleures pratiques.
Pourquoi est-il important d'utiliser le bon client HTTP ?
De nombreux développeurs débutants utilisent l'ancienne classe HttpURLConnection, apparue avec Java 1.1. Bien qu'elle fonctionne, son API est lourde, peu pratique et nécessite beaucoup de code standard. À partir de Java 11, la bibliothèque standard a introduit le moderne java.net.http.HttpClient, qui offre :
- Le support de HTTP/2 et WebSocket
- Les requêtes asynchrones via CompletableFuture
- Un modèle Builder simple et clair
- La gestion automatique des cookies et des redirections
Les bases du travail avec HttpClient en Java 11+
Considérons un exemple de base d'envoi d'une requête GET. D'abord, nous créons une instance du client, puis nous formons la requête et l'envoyons.
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.time.Duration;
public class SimpleHttpClient { public static void main(String[] args) throws Exception { // Create a client with connection timeout HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();
// Form a GET request HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/data")) .timeout(Duration.ofSeconds(30)) .header("Accept", "application/json") .GET() .build();
// Send the request and receive the response HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode()); System.out.println("Response body: " + response.body()); }}Notez l'utilisation de BodyHandlers.ofString() — c'est un moyen pratique d'obtenir le corps de la réponse sous forme de chaîne. Si vous devez traiter du JSON, il est préférable d'utiliser BodyHandlers.ofInputStream() et de le passer à l'analyseur.
Envoi d'une requête POST avec un corps
Pour envoyer des données au serveur (par exemple, lors de l'inscription d'un utilisateur), une requête POST est utilisée. Considérons un exemple avec l'envoi de JSON :
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.time.Duration;
public class PostRequestExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient();
String json = """ { "name": "Ivan Ivanov", "email": "ivan@example.com", "age": 30 } """;
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/users")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .timeout(Duration.ofSeconds(15)) .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 201) { System.out.println("User created successfully!"); System.out.println("ID: " + response.body()); } else { System