java.net.http.HttpClient
Eşzamanlı istekler gönderin
java.net.http.HttpClient, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Modern HTTP İstemcisi
Java 11'den bu yana JDK, java.net.http paketinde modern bir HTTP istemcisi sunar. Eski HttpURLConnection sınıfının yerini, HTTP/1.1 ve HTTP/2'yi destekleyen temiz ve akıcı bir API alır.
Üç temel tür şunlardır:
- HttpClient — istekleri gönderir ve yapılandırmayı (zaman aşımları, vekil sunucular, yönlendirmeler) yönetir.
- HttpRequest — ne gönderileceğinin değişmez tanımıdır.
- HttpResponse — durum, üstbilgiler ve gövde dâhil olmak üzere sonucu içerir.
HttpClient Oluşturma
Bir istemciyi statik newBuilder() yöntemiyle oluşturursunuz. Tek bir istemci birçok istek için yeniden kullanılabilir ve iş parçacığı açısından güvenlidir.
Burada HTTP/2'yi ve bağlantı zaman aşımını yapılandırıyoruz. Hızlı bir varsayılan örnek için newHttpClient() da kullanılabilir.
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());
}
}İstek Oluşturma
HttpRequest değişmezdir ve akıcı bir oluşturucu kullanılarak oluşturulur. En azından bir URI sağlamanız gerekir; varsayılan olarak bir GET gerçekleştirir.
Bir dizeyi URI.create(...) ile URI'ye dönüştürürsünüz.
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());
}
}Senkron Gönderim
send yöntemi, yanıt gelene kadar çağıran iş parçacığını bloklar. İstemciye yanıt gövdesini nasıl yorumlayacağını bildiren bir BodyHandler gerekir.
BodyHandlers.ofString(), gövdeyi bir String içine okur.
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());
}
}Durum Kodunu Okuma
Yanıt, statusCode() değerini bir int olarak sunar. 2xx aralığındaki kodlar başarı anlamına gelir; 3xx yönlendirmeleri, 4xx istemci hatalarını ve 5xx sunucu hatalarını belirtir.
Not: HTTP istemcisi 4xx/5xx yanıtında hiçbir zaman istisna fırlatmaz — kodu kendiniz denetlemeniz gerekir.
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);
}
}Gövdeyi Okuma
BodyHandlers.ofString() ile response.body() bir String döndürür. Baytlar, dosyalar ve akışlar için başka işleyiciler de vardır (bunlar ileride ele alınacaktır).
Bu kod parçası, alacağınız gövde içeriğini benzetir.
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);
}
}Yönlendirmeleri Yönetme
İstemci varsayılan olarak yönlendirmeleri izlemez. Bunu oluşturucu üzerinde followRedirects(...) ile yapılandırın.
HttpClient.Redirect içindeki seçenekler NEVER, ALWAYS ve NORMAL'dir (HTTPS'den HTTP'ye geçişler hariç yönlendirmeleri izler).
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());
}
}İstek Başına Zaman Aşımları
Bağlantı zaman aşımı istemci üzerinde bulunur. Bir istek zaman aşımı (yanıt için ne kadar bekleneceği), timeout(...) aracılığıyla istek üzerinde bulunur.
Süre dolarsa send bir HttpTimeoutException fırlatır.
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());
}
}Yanıt Üstbilgilerini İnceleme
Yanıt, headers() aracılığıyla erişilebilen bir HttpHeaders nesnesi taşır. Üstbilgi aramaları büyük/küçük harfe duyarlı değildir ve birden çok değer döndürebilir; bu nedenle firstValue(...) bir Optional<String> döndürür.
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"));
}
}Denetimli İstisnalar
Senkron send iki denetimli istisna bildirir:
- IOException — ağ veya protokol başarısızlığı.
- InterruptedException — bloklanmış iş parçacığının kesintiye uğratılması.
Her ikisini de yakalamanız veya bildirmeniz gerekir. Asenkron çağrılar (bir sonraki ders) bir gelecek nesnesi döndürerek bundan kaçınır.
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());
}
}
}Yeniden Kullanılabilir İstemci
En iyi uygulama: tek bir HttpClient oluşturun ve bunu uygulama genelinde yeniden kullanın. Bağlantıları havuzda tutar ve iş parçacığı açısından tamamen güvenlidir.
Her istek için yeni bir istemci oluşturmak kaynakları israf eder ve HTTP/2 çoklamasının avantajını ortadan kaldırır.
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));
}
}Hızlı Kontrol
Senkron HTTP istemcisini anlayıp anlamadığınızı sınayın.
Özet
JDK HTTP istemcisinin temellerini öğrendiniz:
- HttpClient.newBuilder() sürümü, zaman aşımını ve yönlendirmeleri yapılandırır; tek örneği yeniden kullanın.
- HttpRequest.newBuilder().uri(...).GET() değişmez bir istek oluşturur.
- client.send(request, BodyHandlers.ofString()) işlemi bloklar ve bir
HttpResponse<String>döndürür. - Sonuçları
statusCode(),body()veheaders()ile okuyun. - 2xx dışındaki kodlar istisna fırlatmaz — bunları kendiniz denetleyin.
Sıkça Sorulan Sorular
“java.net.http.HttpClient” dersi ücretsiz mi?
Evet — “java.net.http.HttpClient” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“java.net.http.HttpClient” dersinde ne öğreneceğim?
Eşzamanlı istekler gönderin Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“java.net.http.HttpClient” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- java.net.http.HttpClient
- Eşzamansız İstekler
- İstek Gövdeleri ve Üst Bilgiler
- Yanıtları İşleme