Einleitung: Warum braucht man einen HTTP-Client in Java?
\n\nModerne Java-Entwicklung kommt selten ohne Interaktion mit externen Diensten aus. Ob es darum geht, Daten an einen Server zu senden, Informationen von einer REST-API zu erhalten oder eine Integration mit Cloud-Plattformen durchzuführen – überall wird ein HTTP-Client benötigt. In Java gibt es mehrere Möglichkeiten, eine HTTP-Anfrage durchzuführen, und es ist wichtig, den richtigen Ansatz zu wählen.
\n\nLange Zeit war die Bibliothek java.net.HttpURLConnection das Standardwerkzeug, aber mit der Veröffentlichung von Java 11 kam ein neues, benutzerfreundlicheres Modul java.net.http hinzu. In diesem Artikel werden wir alle Phasen der Arbeit mit dem HTTP-Client in Java durchgehen: von einfachen GET-Anfragen bis zum Senden von JSON und der Fehlerbehandlung.
Der Artikel richtet sich an Entwickler, die bereits mit den Grundlagen von Java vertraut sind, aber ihr Wissen über Netzwerkanfragen systematisieren möchten. Wir werden den integrierten HttpClient aus Java 11+ verwenden, da dies der moderne und empfohlene Ansatz ist.
1. Grundlagen des HTTP-Clients: Erstellung und Konfiguration
\n\nBevor wir Anfragen senden, müssen wir eine Instanz von HttpClient erstellen. Dies ist das zentrale Objekt, über das alle HTTP-Operationen ausgeführt werden. Betrachten wir die grundlegende Konfiguration.
Erstellen des Clients
\n\nDer einfachste Weg ist die Verwendung der statischen Methode newHttpClient():
import java.net.http.HttpClient;\n\nHttpClient client = HttpClient.newHttpClient();\n\nFür reale Projekte ist jedoch oft die Konfiguration von Timeouts, der Protokollversion oder eines Proxys erforderlich. Hier ist ein Beispiel für eine erweiterte Konfiguration:
\n\nimport java.net.http.HttpClient;\nimport java.time.Duration;\n\nHttpClient client = HttpClient.newBuilder()\n .version(HttpClient.Version.HTTP_2) // HTTP/2 verwenden\n .connectTimeout(Duration.ofSeconds(10)) // Verbindungs-Timeout\n .followRedirects(HttpClient.Redirect.NORMAL) // automatische Weiterleitungen folgen\n .build();\n\nWichtige Konfigurationsparameter
\n\n- \n
- version — Wahl zwischen HTTP/1.1 und HTTP/2 (standardmäßig HTTP/2, wenn der Server es unterstützt) \n
- connectTimeout — maximale Wartezeit für die Verbindung \n
- followRedirects — Richtlinie zur Behandlung von Weiterleitungen (NEVER, ALWAYS, NORMAL) \n
- proxy — Konfiguration des Proxy-Servers (falls erforderlich) \n
Beachten Sie: Eine einzelne Instanz von HttpClient kann für viele Anfragen verwendet werden. Sie ist threadsicher, daher kann sie einmal erstellt und in der gesamten Anwendung wiederverwendet werden.
2. Erstellen und Senden von HTTP-Anfragen
\n\nKommen wir nun zum Wesentlichen – dem Erstellen von Anfragen. In Java 11+ wird dafür die Klasse HttpRequest verwendet. Betrachten wir die wichtigsten Anfragetypen.
GET-Anfrage: Daten abrufen
\n\nGET ist der einfachste Anfragetyp. Er wird verwendet, um Daten vom Server abzurufen. Beispiel:
\n\nimport java.net.URI;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\nHttpRequest request = HttpRequest.newBuilder()\n .uri(URI.create("https://api.example.com/users"))\n .GET() // Methode explizit angeben (kann weggelassen werden, GET ist Standard)\n .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n\nSystem.out.println("Status: " + response.statusCode());\nSystem.out.println("Antwortkörper: " + response.body());\n\nDie Methode send() führt eine synchrone Anfrage aus. Wenn eine asynchrone Ausführung benötigt wird, verwenden Sie sendAsync(), das ein CompletableFuture zurückgibt.
POST-Anfrage: Daten senden
\n\nPOST wird verwendet, um Daten an den Server zu senden. Meistens handelt es sich um JSON oder Formulardaten. Betrachten wir beide Varianten.
\n\nPOST mit JSON:
\n\nimport java.net.http.HttpRequest.BodyPublishers;\n\nString json = "{\\"name\\":\\"Ivan\\",\\"email\\":\\"iva