Client HTTP en Java : faire des requêtes correctement de A à Z
Dans le développement moderne en Java, l'interaction avec les services web externes et les API REST est devenue une partie intégrante de presque toutes les applications. Que vous écriviez un microservice, une application mobile ou un système d'entreprise, savoir envoyer correctement des requêtes HTTP est une compétence cruciale. Dans cet article, nous allons passer en revue toutes les façons de créer un client HTTP en Java : du classique HttpURLConnection aux bibliothèques modernes comme java.net.http.HttpClient, OkHttp et RestTemplate. Vous apprendrez à effectuer des requêtes GET, POST, PUT et DELETE, à traiter les réponses et à choisir le bon outil pour votre tâche.
1. Approche classique : HttpURLConnection
Pendant de nombreuses années, la méthode standard pour travailler avec HTTP en Java était la classe HttpURLConnection. Elle fait partie du JDK et ne nécessite pas de dépendances supplémentaires. Cependant, son API est considérée comme de bas niveau et lourde, surtout pour les requêtes complexes.
Exemple de requête GET :
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;
public class HttpURLConnectionExample { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/users"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json");
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println("Response: " + response.toString()); }}Exemple de requête POST avec JSON :
import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;
public class PostExample { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/users"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true);
String jsonInputString = "{\\"name\\": \\"John\\", \\"age\\": 30}"; try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonInputString.getBytes("utf-8"); os.write(input, 0, input.length); }
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); }}Avantages : intégré au JDK, ne nécessite pas de bibliothèques.
Inconvénients : code complexe, pas de support HTTP/2, gestion peu pratique des timeouts et des erreurs.
2. HttpClient moderne (Java 11+)
À partir de Java 11, un nouveau java.net.http.HttpClient a été ajouté à la bibliothèque standard. Il prend en charge HTTP/2, WebSocket, les requêtes asynchrones et offre une API beaucoup plus propre et moderne.
Requête GET synchrone :
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
public class ModernHttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://a