HTTP-Client in Java: Fortgeschrittene Techniken für die Arbeit mit Anfragen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

HTTP-Client in Java: Anfragen richtig stellen (fortgeschrittenes Niveau)



Die Arbeit mit HTTP-Anfragen ist eine der grundlegenden Aufgaben in der modernen Java-Entwicklung. Das Schreiben von Code, der nicht nur eine Anfrage sendet, sondern dies zuverlässig tut, mit korrekter Fehlerbehandlung, Timeouts und Ressourcenverwaltung, erfordert jedoch ein tiefes Verständnis. In diesem Artikel gehen wir über die einfache HttpURLConnection hinaus und untersuchen fortgeschrittene Techniken für die Arbeit mit HTTP-Clients in Java, unter Verwendung des integrierten java.net.http.HttpClient (Java 11+) und der beliebten Bibliothek OkHttp.



1. Timeout-Verwaltung: Lassen Sie Ihre Anwendung nicht hängen



Eines der häufigsten Probleme bei der Arbeit mit HTTP ist das Einfrieren der Anwendung aufgrund eines langsamen oder nicht erreichbaren Servers. Die korrekte Konfiguration von Timeouts ist der erste Schritt zur Erstellung eines ausfallsicheren Clients.



Arten von Timeouts:

  • Connect-Timeout: Wartezeit für den Aufbau einer TCP-Verbindung zum Server.
  • Read-Timeout (Socket-Timeout): Wartezeit auf Daten vom Server nach dem Verbindungsaufbau.
  • Write-Timeout: Wartezeit für das Senden von Daten an den Server (relevant für POST/PUT).
  • Request-Timeout: Gesamtzeit für die Ausführung der gesamten HTTP-Anfrage (einschließlich Verbindung, Senden und Empfangen der Antwort).


Konfigurationsbeispiel für java.net.http.HttpClient:

import java.net.http.HttpClient;import java.time.Duration;

public class TimeoutExample { public static HttpClient createClientWithTimeouts() { return HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(5)) // Timeout für die Verbindung .build(); }

public static void main(String[] args) { HttpClient client = createClientWithTimeouts(); // Für Read/Write-Timeout verwenden wir HttpRequest var request = java.net.http.HttpRequest.newBuilder() .uri(java.net.URI.create("https://api.example.com/data")) .timeout(Duration.ofSeconds(10)) // Gesamt-Timeout für die Anfrage .GET() .build(); System.out.println("Client mit Timeouts erstellt: " + client); }}


Konfigurationsbeispiel für OkHttp:

import okhttp3.OkHttpClient;import java.util.concurrent.TimeUnit;

public class OkHttpTimeoutExample { public static OkHttpClient createOkHttpClient() { return new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .callTimeout(30, TimeUnit.SECONDS) // Gesamt-Timeout für den gesamten Aufruf .build(); }

public static void main(String[] args) { OkHttpClient client = createOkHttpClient(); System.out.println("OkHttp-Client mit Timeouts ist bereit."); }}


2. Verbindungspool und Wiederverwendung: Ressourcen sparen



Jede neue HTTP-Verbindung erfordert Aufwand für den TCP-Handshake und möglicherweise den TLS-Handshake. Für Anwendungen, die viele Anfragen an denselben Server stellen, ist die Verwendung eines Verbindungspools (Connection Pool) von entscheidender Bedeutung. Dies ermöglicht die Wiederverwendung bestehender Verbindungen, was Anfragen erheblich beschleunigt und die Netzwerklast reduziert.



java.net.http.HttpClient verfügt über einen integrierten Verbindungspool, der automatisch verwaltet wird. Sie können jedoch dessen Größe konfigurieren:

import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.URI;import java.time.Duration;

public class PoolExample { public static void main(String[] args) throws Exception { // HttpClient verwaltet den Pool selbst, aber wir können die Gr

Blogs

Buchempfehlungen