Java Academy · leksjon

java.net.http.HttpClient

Send synkrone forespørsler

Leksjon 1 av 413 trinn

java.net.http.HttpClient er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Den moderne HTTP-klienten

Siden Java 11 leverer JDK-et en moderne HTTP-klient i pakken java.net.http. Den erstatter den gamle HttpURLConnection med et rent, flytende API som støtter HTTP/1.1 og HTTP/2.

De tre sentrale typene er:

  • HttpClient — sender forespørsler og håndterer konfigurasjon (tidsavbrudd, proxyer og omdirigeringer).
  • HttpRequest — en uforanderlig beskrivelse av det som skal sendes.
  • HttpResponse — resultatet, inkludert status, headere og innhold.

Opprette en HttpClient

De bygger en klient med den statiske metoden newBuilder(). Én klient kan brukes på nytt for mange forespørsler, og den er trådsikker.

Her konfigurerer vi HTTP/2 og et tidsavbrudd for tilkoblingen. newHttpClient() er også tilgjengelig for en rask 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());
    }
}

Bygge en forespørsel

HttpRequest er uforanderlig og bygges med en flytende builder. Som et minimum oppgir De en URI; som standard utfører den en GET.

En streng konverteres 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());
    }
}

Sende synkront

Metoden send blokkerer tråden som kaller den, til responsen kommer. Den trenger en BodyHandler som forteller klienten hvordan responsinnholdet skal tolkes.

BodyHandlers.ofString() leser innholdet inn 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());
    }
}

Lese statuskoden

Responsen eksponerer statusCode() som en int. Koder i 2xx-området betyr suksess, 3xx er omdirigeringer, 4xx er klientfeil og 5xx er serverfeil.

Merk: HTTP-klienten kaster aldri et unntak for en 4xx-/5xx-respons – De må 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);
    }
}

Lese innholdet

Med BodyHandlers.ofString() returnerer response.body() en String. Det finnes andre handlere for byte-data, filer og strømmer (som gjennomgås senere).

Dette kodeutdraget simulerer innholdet De ville mottatt.

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åndtere omdirigeringer

Som standard følger klienten ikke omdirigeringer. Dette konfigureres på builderen med followRedirects(...).

Alternativene i HttpClient.Redirect er NEVER, ALWAYS og NORMAL (følger omdirigeringer, bortsett 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());
    }
}

Tidsavbrudd for hver forespørsel

Tilkoblingstidsavbruddet ligger på klienten. Et forespørselstidsavbrudd (hvor lenge det skal ventes på en respons) ligger på forespørselen via timeout(...).

Hvis tidsavbruddet utløper, kaster send et 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øke responsheadere

Responsen inneholder et HttpHeaders-objekt som er tilgjengelig via headers(). Oppslag i headere skiller ikke mellom store og små bokstaver og kan returnere flere verdier, 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"));
    }
}

Kontrollerte unntak

Den synkrone send-metoden deklarerer to kontrollerte unntak:

  • IOException — nettverks- eller protokollfeil.
  • InterruptedException — den blokkerte tråden ble avbrutt.

De må enten fange eller deklarere begge. Asynkrone kall (i neste leksjon) unngår dette ved å returnere en future.

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 klient som kan gjenbrukes

Beste praksis er å opprette én HttpClient og gjenbruke den i hele applikasjonen. Den bruker en tilkoblingspool og er fullstendig trådsikker.

Å opprette en ny klient for hver forespørsel sløser med ressurser og undergraver HTTP/2-multipleksing.

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));
    }
}

Kunnskapssjekk

Test forståelsen Deres av den synkrone HTTP-klienten.

Oppsummering

De har lært det grunnleggende om JDK HTTP-klienten:

  • HttpClient.newBuilder() konfigurerer versjon, tidsavbrudd og omdirigeringer; gjenbruk én instans.
  • HttpRequest.newBuilder().uri(...).GET() bygger en uforanderlig forespørsel.
  • client.send(request, BodyHandlers.ofString()) blokkerer og returnerer en HttpResponse<String>.
  • Les resultatene med statusCode(), body() og headers().
  • Ikke-2xx-koder kaster ikke unntak – kontroller dem selv.
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «java.net.http.HttpClient» gratis?

Ja – hele teksten i «java.net.http.HttpClient» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «java.net.http.HttpClient»?

Send synkrone forespørsler Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «java.net.http.HttpClient»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. java.net.http.HttpClient
  2. Asynkrone forespørsler
  3. Forespørselsdata og headere
  4. Håndtere svar
← Tilbake til Java Academy