java.net.http.HttpClient
ส่งคำขอแบบพร้อมกัน
java.net.http.HttpClient เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
ไคลเอ็นต์ HTTP สมัยใหม่
ตั้งแต่ Java 11 เป็นต้นมา JDK มาพร้อมไคลเอ็นต์ HTTP สมัยใหม่ในแพ็กเกจ java.net.http ซึ่งใช้แทน HttpURLConnection รุ่นเก่าด้วยส่วนติดต่อแบบต่อเนื่องที่สะอาดและรองรับ HTTP/1.1 กับ HTTP/2
ชนิดข้อมูลหลักสามชนิดมีดังนี้:
- HttpClient — ส่งคำขอและจัดการการกำหนดค่า (ระยะหมดเวลา พร็อกซี และการเปลี่ยนเส้นทาง)
- HttpRequest — คำอธิบายแบบเปลี่ยนแปลงไม่ได้ของสิ่งที่จะส่ง
- HttpResponse — ผลลัพธ์ ซึ่งประกอบด้วยสถานะ ส่วนหัว และเนื้อหา
การสร้าง HttpClient
คุณสร้างไคลเอ็นต์ด้วยเมธอดระดับคลาส newBuilder() ไคลเอ็นต์หนึ่งตัวสามารถนำกลับมาใช้กับคำขอจำนวนมากได้ และปลอดภัยต่อการใช้งานจากหลายเธรด
ในที่นี้เรากำหนดค่า HTTP/2 และระยะหมดเวลาการเชื่อมต่อ นอกจากนี้ยังมี newHttpClient() สำหรับสร้างอินสแตนซ์ค่าเริ่มต้นอย่างรวดเร็ว
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());
}
}การสร้างคำขอ
HttpRequest ไม่สามารถเปลี่ยนแปลงได้และสร้างด้วยตัวสร้างแบบต่อเนื่อง อย่างน้อยต้องระบุ URI โดยค่าเริ่มต้นจะดำเนินการ GET
คุณแปลงสตริงเป็น URI ด้วย 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());
}
}การส่งแบบซิงโครนัส
เมธอด send จะระงับเธรดที่เรียกใช้จนกว่าจะได้รับการตอบกลับ เมธอดนี้ต้องใช้ BodyHandler เพื่อบอกไคลเอนต์ว่าควรตีความเนื้อหาการตอบกลับอย่างไร
BodyHandlers.ofString() จะอ่านเนื้อหาเข้าไปเป็น 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());
}
}การอ่านรหัสสถานะ
การตอบกลับจะแสดง statusCode() เป็นค่า int รหัสในช่วง 2xx หมายถึงดำเนินการสำเร็จ รหัส 3xx หมายถึงการเปลี่ยนเส้นทาง รหัส 4xx หมายถึงข้อผิดพลาดของไคลเอนต์ และรหัส 5xx หมายถึงข้อผิดพลาดของเซิร์ฟเวอร์
หมายเหตุ: ไคลเอนต์ HTTP จะไม่โยนข้อยกเว้นเมื่อได้รับการตอบกลับ 4xx/5xx คุณต้องตรวจสอบรหัสด้วยตนเอง
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);
}
}การอ่านเนื้อหา
เมื่อใช้ BodyHandlers.ofString() response.body() จะส่งคืน String ตัวจัดการอื่น ๆ ใช้สำหรับไบต์ ไฟล์ และสตรีม ซึ่งจะกล่าวถึงในภายหลัง
โค้ดตัวอย่างนี้จำลองเนื้อหาที่คุณจะได้รับ
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);
}
}การจัดการการเปลี่ยนเส้นทาง
โดยค่าเริ่มต้น ไคลเอนต์จะไม่ติดตามการเปลี่ยนเส้นทาง คุณกำหนดค่านี้บนตัวสร้างด้วย followRedirects(...)
ตัวเลือกใน HttpClient.Redirect ได้แก่ NEVER, ALWAYS และ NORMAL โดยตัวเลือกหลังจะติดตามการเปลี่ยนเส้นทาง ยกเว้นกรณีลดระดับจาก HTTPS เป็น 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());
}
}ระยะหมดเวลาต่อคำขอ
ระยะหมดเวลาการเชื่อมต่ออยู่ที่ไคลเอนต์ ส่วนระยะหมดเวลาคำขอ ซึ่งเป็นระยะเวลาที่รอการตอบกลับ จะอยู่ที่คำขอผ่าน timeout(...)
หากหมดเวลา send จะโยน 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());
}
}การตรวจสอบส่วนหัวการตอบกลับ
การตอบกลับจะมีออบเจ็กต์ HttpHeaders ซึ่งเข้าถึงได้ผ่าน headers() การค้นหาส่วนหัวไม่คำนึงถึงตัวพิมพ์เล็กใหญ่และอาจส่งคืนหลายค่า ดังนั้น firstValue(...) จึงส่งคืน 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"));
}
}ข้อยกเว้นที่ต้องจัดการ
send แบบซิงโครนัสประกาศข้อยกเว้นที่ต้องจัดการสองรายการ:
- ข้อผิดพลาดการรับส่งข้อมูล — การทำงานของเครือข่ายหรือโพรโทคอลล้มเหลว
- InterruptedException — เธรดที่ถูกระงับการทำงานถูกขัดจังหวะ
คุณต้องดักจับหรือประกาศข้อยกเว้นทั้งสองรายการ ส่วนการเรียกแบบอะซิงโครนัสในบทถัดไปจะหลีกเลี่ยงเรื่องนี้ด้วยการส่งคืนผลลัพธ์ในอนาคต
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());
}
}
}ไคลเอนต์ที่นำกลับมาใช้ซ้ำได้
แนวทางปฏิบัติที่ดีคือสร้าง หนึ่ง HttpClient แล้วนำไปใช้ซ้ำทั่วทั้งแอปพลิเคชัน ไคลเอนต์จะจัดกลุ่มการเชื่อมต่อไว้และปลอดภัยต่อการใช้งานจากหลายเธรดอย่างสมบูรณ์
การสร้างไคลเอนต์ใหม่สำหรับแต่ละคำขอทำให้สิ้นเปลืองทรัพยากรและทำให้สูญเสียประโยชน์จากการมัลติเพล็กซ์ของ 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));
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับไคลเอนต์ HTTP แบบซิงโครนัส
สรุปทบทวน
คุณได้เรียนรู้พื้นฐานของไคลเอนต์ HTTP ใน JDK:
- HttpClient.newBuilder() ใช้กำหนดค่าเวอร์ชัน ระยะหมดเวลา และการเปลี่ยนเส้นทาง ควรนำอินสแตนซ์เดียวกลับมาใช้ซ้ำ
- HttpRequest.newBuilder().uri(...).GET() ใช้สร้างคำขอที่ไม่สามารถเปลี่ยนแปลงได้
- client.send(request, BodyHandlers.ofString()) จะระงับการทำงานและส่งคืน
HttpResponse<String> - อ่านผลลัพธ์ด้วย
statusCode(),body()และheaders() - รหัสที่ไม่ใช่ 2xx จะไม่โยนข้อยกเว้น คุณต้องตรวจสอบด้วยตนเอง
คำถามที่พบบ่อย
บทเรียน “java.net.http.HttpClient” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “java.net.http.HttpClient” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “java.net.http.HttpClient”
ส่งคำขอแบบพร้อมกัน คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “java.net.http.HttpClient” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- java.net.http.HttpClient
- คำขอแบบอะซิงโครนัส
- เนื้อหาและส่วนหัวของคำขอ
- การจัดการการตอบกลับ