java.net.http.HttpClient
Send synkrone forespørgsler
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()ogheaders(). - Ikke-2xx-koder kaster ikke en undtagelse — kontrollér dem selv.
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
- java.net.http.HttpClient
- Asynkrone forespørgsler
- Request bodies og headers
- Håndtering af svar