1.1 Pengenalan kepada HttpClient

Bermula dengan JDK 11, pembangun platform Java menambah alat baharu yang berkuasa pada JDK untuk membuat permintaan http, java.net.http. Ia mengandungi empat kelas utama:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • soket web

Ini adalah kelas yang sangat berkuasa yang membolehkan anda melaksanakan semua jenis permintaan yang mungkin menggunakan HTTP, HTTP/2dan WebSocket.

Selain itu, anda boleh menggunakan kelas ini untuk membuat permintaan http segerak dan tak segerak.

Membuat permintaan http terdiri daripada bahagian berikut:

  1. Buat objekHttpClient
  2. Buat objekHttpRequest
  3. Menghantar permintaan menggunakan kaedah send()atausendAsync()
  4. Pemprosesan tindak balasHttpResponse

Contoh permintaan sedemikian:


 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 Pendekatan deklaratif

Dalam contoh di atas, anda melihat contoh pendekatan deklaratif yang dipanggil untuk menulis kod. Mari kita lihat bahagian pertama contoh:


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

Apakah rupa kod ini yang ditulis dalam gaya klasik:


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

Apabila menggunakan pendekatan deklaratif dalam kod, dua perkara berubah. Pertama , semua kaedah kelas HttpClient mengembalikan objek mereka sendiri , yang membolehkan anda menyusun kod dalam bentuk rantai.

Kod klasik:

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

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Kami memindahkan setiap kaedah ke baris yang berasingan (ini adalah satu pernyataan panjang)

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

Kedua , awalan dialih keluar daripada kaedah set, yang membolehkan anda menulis kod dengan lebih padat:

Adakah

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

Ia menjadi

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

Kod sedemikian lebih mudah dibaca, walaupun lebih sukar untuk ditulis.

Dan satu lagi perkara penting. Dalam contoh ini, corak Builder telah digunakan. Terdapat senario di mana mencipta objek adalah proses yang kompleks. Oleh itu, mereka lebih suka untuk memformalkannya: ia bermula dengan panggilan kaedah bersyarat begin()dan berakhir dengan panggilan kaedah bersyarat end().

Dalam contoh yang kami analisis, kaedah HttpClient.newBuilder()mengembalikan objek HttpClient.Builder(ini ialah kelas utiliti dalaman kelas HttpClient). Semua kaedah jenis version()dipanggil hanya pada objek perkhidmatan ini. Nah, panggilan kaedah build()menandakan tamatnya pembinaan objek dan mengembalikan objek HttpClient.