0Pricing
Java Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. java.net.http.HttpClient
  2. คำขอแบบอะซิงโครนัส
  3. เนื้อหาและส่วนหัวของคำขอ
  4. การจัดการการตอบกลับ
← กลับไปที่ Java Academy