Java Academy · Lektion

java.net.http.HttpClient

Send synkrone forespørgsler

Lektion 1 af 413 trin

java.net.http.HttpClient er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Den moderne HTTP-klient

Siden Java 11 leverer JDK'et en moderne HTTP-klient i pakken java.net.http. Den erstatter den gamle HttpURLConnection med en ren, flydende API, der understøtter HTTP/1.1 og HTTP/2.

De tre centrale typer er:

  • HttpClient — sender forespørgsler og håndterer konfiguration (tidsgrænser, proxyer, omdirigeringer).
  • HttpRequest — en uforanderlig beskrivelse af det, der skal sendes.
  • HttpResponse — resultatet, herunder status, headere og indhold.

Oprettelse af en HttpClient

Du opbygger en klient med den statiske metode newBuilder(). En enkelt klient kan genbruges til mange forespørgsler, og den er trådsikker.

Her konfigurerer vi HTTP/2 og en forbindelsestidsgrænse. newHttpClient() er også tilgængelig, hvis du hurtigt vil oprette en standardinstans.

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

public class Main {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_2)
            .connectTimeout(Duration.ofSeconds(10))
            .build();
        System.out.println("Client version: " + client.version());
    }
}

Oprettelse af en anmodning

HttpRequest er uforanderlig og oprettes med en fluent builder. Som minimum angiver du en URI; som standard udfører den en GET-anmodning.

Du konverterer en streng til en URI med URI.create(...).

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

public class Main {
    public static void main(String[] args) {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/data"))
            .GET()
            .build();
        System.out.println("Method: " + request.method());
        System.out.println("URI: " + request.uri());
    }
}

Synkron afsendelse

Metoden send blokerer den kaldende tråd, indtil svaret ankommer. Den kræver en BodyHandler, som fortæller klienten, hvordan svarets brødtekst skal fortolkes.

BodyHandlers.ofString() læser brødteksten ind i en String.

import java.net.URI;
import java.net.http.*;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com"))
            .build();
        HttpResponse<String> response =
            client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("Status: " + response.statusCode());
    }
}

Læsning af statuskoden

Svaret eksponerer statusCode() som en int. Koder i området 2xx betyder succes, 3xx er omdirigeringer, 4xx er klientfejl, og 5xx er serverfejl.

Bemærk: HTTP-klienten kaster aldrig en undtagelse ved et 4xx/5xx-svar — du skal selv kontrollere koden.

public class Main {
    public static void main(String[] args) {
        int status = 404;
        String label;
        if (status >= 200 && status < 300) label = "Success";
        else if (status >= 300 && status < 400) label = "Redirect";
        else if (status >= 400 && status < 500) label = "Client error";
        else label = "Server error";
        System.out.println(status + " -> " + label);
    }
}

Læsning af brødteksten

Med BodyHandlers.ofString() returnerer response.body() en String. Der findes andre behandlere til bytes, filer og datastrømme, som gennemgås senere.

Dette kodestykke simulerer det brødtekstindhold, du ville modtage.

public class Main {
    public static void main(String[] args) {
        String body = "{\"message\":\"hello\"}";
        System.out.println("Body length: " + body.length());
        System.out.println("Body: " + body);
    }
}

Håndtering af omdirigeringer

Som standard følger klienten ikke omdirigeringer. Du konfigurerer dette på builderen med followRedirects(...).

Indstillingerne i HttpClient.Redirect er NEVER, ALWAYS og NORMAL (følg alle omdirigeringer bortset fra nedgraderinger fra HTTPS til HTTP).

import java.net.http.HttpClient;

public class Main {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newBuilder()
            .followRedirects(HttpClient.Redirect.NORMAL)
            .build();
        System.out.println("Redirect policy: " + client.followRedirects());
    }
}

Tidsgrænser pr. anmodning

Forbindelsens tidsgrænse findes på klienten. En anmodningstidsgrænse, altså hvor længe der ventes på et svar, findes på anmodningen via timeout(...).

Hvis tidsgrænsen overskrides, kaster send en HttpTimeoutException.

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

public class Main {
    public static void main(String[] args) {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com"))
            .timeout(Duration.ofSeconds(5))
            .build();
        System.out.println("Timeout set: " + request.timeout().isPresent());
    }
}

Undersøgelse af svarheadere

Svaret indeholder et HttpHeaders-objekt, som er tilgængeligt via headers(). Søgning i headere skelner ikke mellem store og små bogstaver og kan returnere flere værdier, så firstValue(...) returnerer en Optional<String>.

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        // Simulating a header lookup result
        Optional<String> contentType = Optional.of("application/json");
        System.out.println("Content-Type: " + contentType.orElse("unknown"));
    }
}

Kontrollerede undtagelser

Den synkrone send angiver to kontrollerede undtagelser:

  • IOException — netværks- eller protokolfejl.
  • InterruptedException — den blokerede tråd blev afbrudt.

Du skal enten fange eller angive begge. Asynkrone kald, som gennemgås i næste lektion, undgår dette ved at returnere en fremtidig værdi.

import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            // client.send(...) would go here
            throw new IOException("connection refused");
        } catch (IOException e) {
            System.out.println("Network problem: " + e.getMessage());
        }
    }
}

En genbrugelig klient

Bedste praksis: Opret én HttpClient, og genbrug den i hele applikationen. Den samler forbindelser i puljer og er fuldt trådsikker.

Hvis du opretter en ny klient pr. anmodning, spilder du ressourcer og forhindrer effektiv brug af HTTP/2-multiplexing.

import java.net.http.HttpClient;

public class Main {
    private static final HttpClient SHARED = HttpClient.newHttpClient();

    public static void main(String[] args) {
        System.out.println("Shared client ready: " + (SHARED != null));
    }
}

Hurtigt tjek

Test din forståelse af den synkrone HTTP-klient.

Opsummering

Du har lært det grundlæggende om JDK's HTTP-klient:

  • HttpClient.newBuilder() konfigurerer version, tidsgrænse og omdirigeringer; genbrug én instans.
  • HttpRequest.newBuilder().uri(...).GET() opretter en uforanderlig anmodning.
  • client.send(request, BodyHandlers.ofString()) blokerer og returnerer en HttpResponse<String>.
  • Læs resultater med statusCode(), body() og headers().
  • Ikke-2xx-koder kaster ikke en undtagelse — kontrollér dem selv.
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “java.net.http.HttpClient” gratis?

Ja — hele teksten til “java.net.http.HttpClient” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “java.net.http.HttpClient”?

Send synkrone forespørgsler Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “java.net.http.HttpClient”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. java.net.http.HttpClient
  2. Asynkrone forespørgsler
  3. Request bodies og headers
  4. Håndtering af svar
← Tilbage til Java Academy