HTTP-Anfragen in Java

Wie wird eine HTTP-Anfrage in Java an eine Server gesendet? Mit dieser Frage werden sich viele Entwickler beschäftigen müssen. Grund genug, in diesem Artikel eine Lösung für Java 11 oder höher zu präsentieren.

Für HTTP-Anfragen können zwei Wege beschritten werden. Da wären zunächst die Core Libraries, also jene Bibliotheken, die bereits Bestandteil des Java Development Kit sind. Dies sind

  • HttpURLConnection und
  • HttpClient

Darüber hinaus existieren auch Bibliotheken von Drittanbietern, z.B. ApacheHttpClient oder OkHttp.

In diesem Blogbeitrag geht es um HttpClient, eine Bibliothek, die seit Java 11 verwendet werden kann und die mit

import java.net.http.HttpClient;

importiert werden muss. Außerdem benötigen wir für dieses Beispiel:

import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

Schauplatz dieser Anfrage ist hier die Klasse Main, in der zunächst die URL angegeben wird:

String url = "https://xern-statistic.de/api/countries";

Dabei handelt es sich um Daten (Hauptstadt, Regierungsform, etc.) zu verschiedenen Staaten. Diese liegen im JSON-Format vor. Für Deutschland sieht das so aus:

{
    "country": "Germany",
    "capital": "Berlin",
    "government": "Federal parliamentary republic",
    "population": 83166711,
    "currency": "Euro"
}

Weiter geht es mit dem seit Java 11 zur Verfügung stehenden HTTP-Client: java.net.http.HttpClient Diese Bibliothek kann mit HTTP/2 umgehen und bietet die Möglichkeit, die Anfragen sowohl synchron als auch asynchron durchzuführen. Standardmäßig wird eine HTTP/2-Anfrage gesendet. Sollte HTTP/2 nicht zur Verfügung stehen, erfolgt automatisch eine HTTP/1.1-Anfrage.

HttpClient client = HttpClient.newHttpClient();

Jetzt folgt die eigentliche Anfrage:

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .build();

Anschließend wird die (asynchrone) Anfrage gesendet:

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body)
            .thenAccept(System.out::println)
            .join();

Der komplette Code sieht damit wie folgt aus:

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

public class Main {
    public static void main(String[] args) {

        String url = "https://xern-statistic.de/api/countries";
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();
    }
}