1.1 HttpClient'e Giriş

JDK 11'den başlayarak, Java platformunun geliştiricileri JDK'ya http istekleri yapmak için yeni ve güçlü bir araç olan java.net.http. Dört temel sınıf içerir:

  • HttpClient
  • Http İsteği
  • HttpResponse
  • web soketi

Bunlar , ve HTTPkullanarak olası tüm istek türlerini gerçekleştirmenize izin veren çok güçlü sınıflardır .HTTP/2WebSocket

Ayrıca bu sınıfları hem senkron hem de asenkron http istekleri yapmak için kullanabilirsiniz.

Bir http isteği yapmak aşağıdaki bölümlerden oluşur:

  1. bir nesne oluşturHttpClient
  2. bir nesne oluşturHttpRequest
  3. send()veya yöntemini kullanarak istek göndermesendAsync()
  4. Yanıt işlemeHttpResponse

Böyle bir istek örneği:


 HttpClient client = HttpClient.newBuilder()
        .version(Version.HTTP_1_1)
        .followRedirects(Redirect.NORMAL)
        .connectTimeout(Duration.ofSeconds(20))
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
        .authenticator(Authenticator.getDefault())
        .build();
 
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body()); 

1.2 Bildirimsel yaklaşım

Yukarıdaki örnekte, kod yazmak için sözde bildirimsel yaklaşımın bir örneğini görüyorsunuz. Örneğin ilk kısmına bir göz atalım:


 HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();

Klasik tarzda yazılmış bu kod nasıl görünürdü:


HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setProxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)));
client.setAuthenticator(Authenticator.getDefault());

Kodda bildirimsel yaklaşımı kullanırken iki şey değişir. İlk olarak , tüm sınıf yöntemleri, kodu zincirler biçiminde düzenlemenize olanak tanıyan HttpClient kendi nesnesini döndürür .

Klasik kod:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
Zincir olarak:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Her yöntemi ayrı bir satıra aktarıyoruz (bu uzun bir ifadedir)

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

ikinci olarak , önek yöntemlerden kaldırılır set, bu da kodu daha kompakt bir şekilde yazmanıza olanak tanır:

oldu

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Dönüştü

HttpClient client = HttpClient.new()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.authenticator(Authenticator.getDefault());
    

Böyle bir kodun okunması daha kolaydır, ancak yazılması daha zordur.

Ve bir önemli nokta daha. Bu örnekte Builder modeli kullanılmıştır. Bir nesne oluşturmanın karmaşık bir süreç olduğu senaryolar vardır. Bu nedenle, resmileştirmeyi tercih ederler: koşullu bir yöntem çağrısı ile başlar begin()ve koşullu bir yöntem çağrısı ile biter end().

İncelediğimiz örnekte, yöntem HttpClient.newBuilder()bir nesne döndürür HttpClient.Builder(bu, sınıfın dahili bir yardımcı sınıftır HttpClient). Bu türdeki tüm yöntemler version()yalnızca bu hizmet nesnesinde çağrılır. Yöntemin çağrılması, build()nesnenin inşasının sonunu işaretler ve nesneyi döndürür HttpClient.