1.1 บทนำสู่ HttpClient

เริ่มต้นด้วย JDK 11 นักพัฒนาของแพลตฟอร์ม Java ได้เพิ่มเครื่องมือใหม่ที่มีประสิทธิภาพให้กับ JDK สำหรับการสร้างคำขอ http ซึ่งเป็นไฟล์java.net.http. ประกอบด้วยสี่คลาสหลัก:

  • Httpไคลเอนต์
  • HttpRequest
  • HttpResponse
  • ซ็อกเก็ตเว็บ

คลาสเหล่านี้เป็นคลาส ที่ทรงพลังมากซึ่งช่วยให้คุณสามารถดำเนินการตามคำขอได้ทุกประเภทโดยใช้HTTP, HTTP/2และWebSocket

นอกจากนี้ คุณสามารถใช้คลาสเหล่านี้เพื่อสร้างคำขอ http ทั้งแบบซิงโครนัสและแบบอะซิงโครนัส

การร้องขอ http ประกอบด้วยส่วนต่อไปนี้:

  1. สร้างวัตถุHttpClient
  2. สร้างวัตถุHttpRequest
  3. การส่งคำขอโดยใช้send()หรือ เมธอดsendAsync()
  4. การประมวลผลการตอบสนองHttpResponse

ตัวอย่างคำขอดังกล่าว:


 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 วิธีการประกาศ

ในตัวอย่างด้านบน คุณจะเห็นตัวอย่างวิธีการเขียนโค้ดที่เรียกว่าการประกาศ มาดูตัวอย่างส่วนแรกกัน:


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

โค้ดนี้จะมีลักษณะอย่างไรเมื่อเขียนในรูปแบบคลาสสิก:


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

เมื่อใช้วิธีการประกาศในรหัส มีสองสิ่งที่เปลี่ยนแปลง ประการ แรกเมธอดของคลาสทั้งหมดHttpClient จะส่งคืนอ็อบเจกต์ของตัวเองซึ่งช่วยให้คุณสามารถจัดระเบียบโค้ดในรูปแบบของเชนได้

รหัสคลาสสิก:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
เป็นห่วงโซ่:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
เราโอนแต่ละวิธีไปยังบรรทัดแยกต่างหาก (นี่คือคำสั่งเดียวแบบยาว)

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

ประการที่สองคำนำหน้าจะถูกลบออกจากวิธีการsetซึ่งช่วยให้คุณเขียนโค้ดได้กระชับยิ่งขึ้น:

เคยเป็น

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

มันกลายเป็น

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

โค้ดดังกล่าวอ่านง่ายกว่าแม้ว่าจะเขียนยากกว่าก็ตาม

และอีกหนึ่งจุดสำคัญ ในตัวอย่างนี้ ใช้รูปแบบตัวสร้าง มีสถานการณ์ที่การสร้างวัตถุเป็นกระบวนการที่ซับซ้อน ดังนั้นพวกเขาจึงต้องการทำให้มันเป็นทางการ: มันเริ่มต้นด้วยการเรียกเมธอดแบบมีเงื่อนไขและbegin()จบลงด้วยการเรียกเมธอดแบบมีเงื่อนไขend()

ในตัวอย่างที่เราวิเคราะห์ วิธีHttpClient.newBuilder()การส่งคืนวัตถุHttpClient.Builder(นี่คือคลาสยูทิลิตี้ภายในของคลาสHttpClient) เมธอดทุกประเภทversion()ถูกเรียกใช้บนออบเจกต์บริการนี้เท่านั้น การเรียกใช้เมธอดbuild()เป็นการสิ้นสุดการสร้างวัตถุและส่งคืนHttpClientวัตถุ