© lassedesignen/Shutterstock.com
Javas neuer HTTP-Client

Was lange währt ...


Aktuelle Trends der Softwareentwicklung wie Microservices oder Cloud führen dazu, dass immer häufiger verteilte Systeme entstehen. Diese erfordern Kommunikation, und HTTP zählt hier zu den am häufigsten eingesetzten Protokollen. Somit ist es enorm wichtig, dass eine so populäre Programmiersprache wie Java eine zeitgemäße Unterstützung für den Versand von HTTP Requests mitbringt. Überraschenderweise war das sehr lange Zeit nicht der Fall.

Über viele Jahre hinweg bestand die HTTP-Unterstützung von Java SE aus der (abstrakten) Klasse HttpURLConnection und davon abgeleiteten Klassen. HttpURLConnection wurde mit Java 1.1 im Jahr 1997 Komponenten-(!) eingeführt. Zwar wurde die Klasse über die Jahre immer mal wieder leicht erweitert, im Grunde mussten Entwickler aber bis zum Erscheinen von Java SE 11 mit einer vollkommen veralteten Unterstützung für HTTP leben. Ein Umstand, der doch stark verwundert, bedenkt man die Wichtigkeit des Protokolls in der Softwareentwicklung der letzten zehn bis fünfzehn Jahre. So existieren in HttpURLConnection keine dedizierten Methoden für das Setzen und Auslesen von HTTP-Headern oder zur Authentifizierung. Weiterhin gibt es keine eingebaute Unterstützung für asynchrone Requests. Entwickler müssen sich um das Erzeugen, Starten und Verwalten nebenläufiger Threads also selbst kümmern. Es gibt keine Unterstützung für PATCH oder gar HTTP/2. Und zu allem Überfluss ist auch der Programmieraufwand beim Einsatz von HttpURLConnection recht hoch, da das API der Klasse hoffnungslos veraltet und gemessen an aktuellen Standards sehr umständlich ist. So erfordert der einfache Versand eines HTTP Requests eine aus heutiger Sicht beinahe absurd anmutende Anzahl von Codezeilen (Listing 1).

Listing 1: Versand von HTTP Requests mit HttpUrlConnection

try { URL url = new URL("http://..."); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); // set request headers con.setRequestProperty("Accept", "application/json"); // set timeouts (default is infinity!) con.setConnectTimeout(1000); con.setReadTimeout(5000); // execute the request con.connect(); // determine status int responseStatus = con.getResponseCode(); // read response body Reader streamReader; if (responseStatus > 399) { streamReader = new InputStreamReader(con.getErrorStream()); } else { streamReader = new InputStreamReader(con.getInputStream()); } BufferedReader in = new BufferedReader(streamReader); String inputLine; StringBuffer content = new Strin...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang