W3docs

Java HttpURLConnection

Effectuez des requêtes HTTP en Java avec l'API HttpURLConnection classique.

HttpURLConnection est la sous-classe de URLConnection adaptée à HTTP. Lorsque vous appelez openConnection() sur une URL http: ou https:, l'objet retourné est un HttpURLConnection — effectuez un cast pour accéder aux fonctionnalités HTTP spécifiques : définir la méthode de requête, lire le code de statut et accéder au flux d'erreur séparé. Il s'agit du client HTTP d'origine du JDK, disponible depuis Java 1.1.

Ce chapitre traite du cast de la connexion et du choix d'une méthode, de l'envoi d'un corps de requête, du code de statut et des deux flux de réponse (le piège classique du flux d'erreur), ainsi qu'un exemple complet de requête POST que vous pouvez exécuter.

Note moderne : pour tout nouveau code, préférez java.net.http.HttpClient — il est plus propre, supporte HTTP/2 et gère l'asynchrone. HttpURLConnection est encore très présent dans les bases de code plus anciennes, il vaut donc la peine d'être bien maîtrisé.

Cast et choix d'une méthode

URL url = URI.create("http://example.com/api").toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");                       // GET is the default
conn.setRequestProperty("Content-Type", "application/json");
conn.setConnectTimeout(2000);
conn.setReadTimeout(2000);

setRequestMethod accepte "GET", "POST", "PUT", "DELETE", etc. Ajoutez des en-têtes de requête avec setRequestProperty.

Envoyer un corps de requête

Pour envoyer un corps, vous devez activer cette option avec setDoOutput(true) (ce qui fait également passer la méthode par défaut à POST), puis écrire dans le flux de sortie :

conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
    os.write(payload.getBytes(StandardCharsets.UTF_8));
}

Code de statut et les deux flux

La fonctionnalité HTTP déterminante est le code de statut, et le piège qui en découle :

int code = conn.getResponseCode();          // triggers the request
InputStream body = (code >= 200 && code < 400)
        ? conn.getInputStream()             // success body
        : conn.getErrorStream();            // error body (4xx/5xx)

getInputStream() lève une IOException pour une réponse 4xx/5xx. Le corps d'erreur se trouve sur un flux différent, getErrorStream(). Oublier cela est le bug classique de HttpURLConnection : une réponse d'erreur provoque une exception au lieu de vous permettre de lire l'explication du serveur. Commencez toujours par appeler getResponseCode(). Terminez avec conn.disconnect().

Exemple concret : un aller-retour POST

Ce programme lance un serveur loopback qui renvoie le corps de la requête avec un 201 Created, puis effectue un POST via HttpURLConnection : définition de la méthode, écriture d'un corps, lecture du statut et choix du bon flux.

java— editable, runs on the server

Ce qu'il faut retenir de cet exemple :

  • Caster le URLConnection en HttpURLConnection a débloqué la couche HTTP : setRequestMethod("POST"), getResponseCode() et getResponseMessage() n'existent que sur la sous-classe. Pour une URL http:, l'objet est réellement un HttpURLConnection, donc le cast réussit toujours.
  • Envoyer un corps a nécessité setDoOutput(true) avant d'écrire dans getOutputStream(). Sans cet appel, la connexion reste en lecture seule et l'écriture échoue — activer la sortie est le commutateur qui transforme un GET en une requête avec corps.
  • getResponseCode() a retourné 201 et c'est lui qui a effectivement déclenché la requête vers le serveur. Le code de statut est la première chose à lire, car la décision suivante — quel flux lire — en dépend.
  • L'exemple a bifurqué entre getInputStream() et getErrorStream(). Ici 201 est un succès, donc le flux d'entrée portait le corps renvoyé, mais pour une réponse 4xx/5xx getInputStream() aurait levé une exception et le message du serveur n'aurait été accessible qu'à travers getErrorStream(). Cette bifurcation est l'angle le plus tranchant de l'API.
  • Le flux a nécessité plus de cinq appels de configuration pour un seul POST, et disconnect() pour le nettoyage. Cette verbosité — flux manuels, piège du flux d'erreur, pas d'async intégré — est exactement la raison pour laquelle HttpClient existe.

Quand utiliser HttpURLConnection

Optez pour HttpURLConnection lorsque vous êtes sur un ancien JDK (avant Java 11), lorsqu'une bibliothèque ou une base de code l'utilise déjà comme standard, ou lorsque vous souhaitez éviter toute dépendance supplémentaire pour un seul appel simple. Pour tout ce qui est nouveau et non trivial — réutilisation des connexions, HTTP/2, async ou des objets requête/réponse plus propres — préférez le moderne HttpClient. Si vous avez seulement besoin de lire depuis une URL sans contrôle HTTP spécifique, les classes URL et URLConnection suffisent.

Pratique

Pratique
Un client effectue un PUT avec 'HttpURLConnection'. Lorsque le serveur retourne '400 Bad Request', le code plante avec une 'IOException' sur 'conn.getInputStream()' au lieu de journaliser le message d'erreur du serveur. Quelle est la correction appropriée ?
Un client effectue un PUT avec 'HttpURLConnection'. Lorsque le serveur retourne '400 Bad Request', le code plante avec une 'IOException' sur 'conn.getInputStream()' au lieu de journaliser le message d'erreur du serveur. Quelle est la correction appropriée ?
Was this page helpful?