java.net.http.HttpClient
Wysyłanie żądań synchronicznych
java.net.http.HttpClient to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Nowoczesny klient HTTP
Od wersji Java 11 JDK zawiera nowoczesnego klienta HTTP w pakiecie java.net.http. Zastępuje on stary HttpURLConnection przejrzystym, płynnym API obsługującym protokoły HTTP/1.1 i HTTP/2.
Trzy podstawowe typy to:
- HttpClient — wysyła żądania i zarządza konfiguracją (limitami czasu, serwerami proxy i przekierowaniami).
- HttpRequest — niezmienny opis tego, co ma zostać wysłane.
- HttpResponse — wynik zawierający kod statusu, nagłówki i treść.
Tworzenie obiektu HttpClient
Klienta tworzy się za pomocą statycznej metody newBuilder(). Jeden klient może być używany ponownie dla wielu żądań i jest bezpieczny wątkowo.
W tym przykładzie konfigurujemy HTTP/2 oraz limit czasu połączenia. Metoda newHttpClient() jest również dostępna, gdy potrzebna jest szybko utworzona instancja z domyślną konfiguracją.
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());
}
}Budowanie żądania
HttpRequest jest niezmienny i tworzony za pomocą buildera. Wymagane jest co najmniej podanie URI; domyślnie wykonywane jest żądanie GET.
Łańcuch znaków można przekształcić w URI za pomocą 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());
}
}Wysyłanie synchroniczne
Metoda send blokuje wątek wywołujący do momentu nadejścia odpowiedzi. Wymaga obiektu BodyHandler, który informuje klienta, jak interpretować treść odpowiedzi.
BodyHandlers.ofString() odczytuje treść do obiektu 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());
}
}Odczytywanie kodu statusu
Odpowiedź udostępnia kod statusCode() jako wartość typu int. Kody z zakresu 2xx oznaczają powodzenie, 3xx — przekierowania, 4xx — błędy klienta, a 5xx — błędy serwera.
Uwaga: klient HTTP nie zgłasza wyjątku dla odpowiedzi 4xx/5xx — kod należy sprawdzić samodzielnie.
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);
}
}Odczytywanie treści
W przypadku użycia BodyHandlers.ofString() metoda response.body() zwraca obiekt String. Dostępne są także inne handlery obsługujące bajty, pliki i strumienie (zostaną omówione później).
Poniższy fragment symuluje treść, którą można by otrzymać.
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);
}
}Obsługa przekierowań
Domyślnie klient nie podąża za przekierowaniami. Należy skonfigurować to w builderze za pomocą followRedirects(...).
Opcje w HttpClient.Redirect to NEVER, ALWAYS i NORMAL (podążanie za przekierowaniami z wyjątkiem obniżenia z HTTPS do 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());
}
}Limity czasu żądań
Limit czasu połączenia jest ustawiany na kliencie. Limit czasu żądania (czyli czas oczekiwania na odpowiedź) jest ustawiany na żądaniu za pomocą timeout(...).
Po jego upływie metoda send zgłasza wyjątek 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());
}
}Sprawdzanie nagłówków odpowiedzi
Odpowiedź zawiera obiekt HttpHeaders dostępny za pomocą headers(). Wyszukiwanie nagłówków nie uwzględnia wielkości liter, a nagłówek może mieć wiele wartości, dlatego firstValue(...) zwraca obiekt 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"));
}
}Wyjątki kontrolowane
Synchroniczna metoda send deklaruje dwa wyjątki kontrolowane:
- IOException — błąd sieci lub protokołu.
- InterruptedException — zablokowany wątek został przerwany.
Należy przechwycić oba wyjątki lub zadeklarować ich zgłaszanie. Wywołania asynchroniczne (w następnej lekcji) nie wymagają tego, ponieważ zwracają obiekt 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());
}
}
}Klient wielokrotnego użytku
Dobra praktyka: należy utworzyć jeden obiekt HttpClient i używać go ponownie w całej aplikacji. Klient zarządza pulą połączeń i jest w pełni bezpieczny wątkowo.
Tworzenie nowego klienta dla każdego żądania marnuje zasoby i uniemożliwia korzystanie z multipleksowania HTTP/2.
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));
}
}Szybki test
Proszę sprawdzić zrozumienie zasad działania synchronicznego klienta HTTP.
Podsumowanie
Opanowano podstawy klienta HTTP z JDK:
- HttpClient.newBuilder() konfiguruje wersję, limit czasu i przekierowania; należy używać ponownie jednej instancji.
- HttpRequest.newBuilder().uri(...).GET() tworzy niezmienne żądanie.
- client.send(request, BodyHandlers.ofString()) blokuje i zwraca obiekt
HttpResponse<String>. - Wyniki można odczytywać za pomocą metod
statusCode(),body()iheaders(). - Kody inne niż 2xx nie powodują zgłoszenia wyjątku — należy sprawdzić je samodzielnie.
Często zadawane pytania
Czy lekcja „java.net.http.HttpClient” jest bezpłatna?
Tak — pełny tekst „java.net.http.HttpClient” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „java.net.http.HttpClient”?
Wysyłanie żądań synchronicznych Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „java.net.http.HttpClient”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- java.net.http.HttpClient
- Żądania asynchroniczne
- Treści żądań i nagłówki
- Obsługa odpowiedzi