Java Academy · Pelajaran

java.net.http.HttpClient

Hantar permintaan segerak

Pelajaran 1 daripada 413 langkah

java.net.http.HttpClient ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Klien HTTP Moden

Sejak Java 11, JDK menyediakan klien HTTP moden dalam pakej java.net.http. Klien ini menggantikan HttpURLConnection lama dengan API lancar yang kemas serta menyokong HTTP/1.1 dan HTTP/2.

Tiga jenis terasnya ialah:

  • HttpClient — menghantar permintaan dan mengurus konfigurasi (had masa, proksi, ubah hala).
  • HttpRequest — penerangan tidak boleh ubah tentang perkara yang hendak dihantar.
  • HttpResponse — hasilnya, termasuk status, pengepala dan isi.

Membina HttpClient

Anda membina klien dengan kaedah statik newBuilder(). Satu klien boleh digunakan semula untuk banyak permintaan dan selamat digunakan oleh berbilang utas.

Di sini kami mengkonfigurasi HTTP/2 dan had masa sambungan. newHttpClient() juga tersedia untuk mendapatkan tika lalai dengan cepat.

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

Membina Permintaan

HttpRequest tidak berubah dan dibina menggunakan pembina berantai. Sekurang-kurangnya, anda perlu memberikan URI; secara lalai, ia melaksanakan GET.

Anda menukar rentetan kepada URI menggunakan 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());
    }
}

Menghantar Secara Segerak

Kaedah send menyekat utas pemanggil sehingga respons tiba. Kaedah ini memerlukan BodyHandler yang memberitahu klien cara mentafsir badan respons.

BodyHandlers.ofString() membaca badan ke dalam 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());
    }
}

Membaca Kod Status

Respons mendedahkan statusCode() sebagai int. Kod dalam julat 2xx bermaksud berjaya, 3xx ialah pengalihan, 4xx ialah ralat klien dan 5xx ialah ralat pelayan.

Nota: klien HTTP tidak pernah melontarkan pengecualian untuk respons 4xx/5xx — anda mesti menyemak kod itu sendiri.

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

Membaca Badan

Dengan BodyHandlers.ofString(), response.body() mengembalikan String. Pengendali lain tersedia untuk bait, fail dan strim (yang akan dibincangkan kemudian).

Coretan ini mensimulasikan kandungan badan yang akan anda terima.

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

Mengendalikan Pengalihan

Secara lalai, klien tidak mengikuti pengalihan. Konfigurasikan tetapan ini pada pembina dengan followRedirects(...).

Pilihan dalam HttpClient.Redirect ialah NEVER, ALWAYS dan NORMAL (mengikuti pengalihan kecuali penurunan taraf daripada HTTPS kepada 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());
    }
}

Tamat Masa Setiap Permintaan

Tamat masa sambungan ditetapkan pada klien. Tamat masa permintaan (tempoh menunggu respons) ditetapkan pada permintaan melalui timeout(...).

Jika tempoh ini tamat, send melontarkan 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());
    }
}

Memeriksa Pengepala Respons

Respons membawa objek HttpHeaders yang boleh dicapai melalui headers(). Carian pengepala tidak peka huruf besar kecil dan mungkin mengembalikan beberapa nilai, jadi firstValue(...) mengembalikan 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"));
    }
}

Pengecualian Disemak

send secara segerak mengisytiharkan dua pengecualian yang disemak:

  • Pengecualian input/output — kegagalan rangkaian atau protokol.
  • InterruptedException — utas yang disekat telah diganggu.

Anda mesti menangkap atau mengisytiharkan kedua-duanya. Panggilan tak segerak (dalam pelajaran seterusnya) mengelakkan perkara ini dengan mengembalikan nilai masa hadapan.

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

Klien yang Boleh Digunakan Semula

Amalan terbaik: cipta satu HttpClient dan gunakannya semula di seluruh aplikasi. Klien ini mengumpulkan sambungan dan selamat sepenuhnya untuk digunakan oleh banyak utas.

Mencipta klien baharu bagi setiap permintaan membazirkan sumber dan menafikan manfaat pemultipleksan 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));
    }
}

Semakan Pantas

Uji pemahaman anda tentang klien HTTP secara segerak.

Imbas Kembali

Anda telah mempelajari asas klien HTTP JDK:

  • HttpClient.newBuilder() mengkonfigurasikan versi, tamat masa dan pengalihan; gunakan semula satu instans.
  • HttpRequest.newBuilder().uri(...).GET() membina permintaan yang tidak berubah.
  • client.send(request, BodyHandlers.ofString()) menyekat dan mengembalikan HttpResponse<String>.
  • Baca hasil menggunakan statusCode(), body() dan headers().
  • Kod selain 2xx tidak melontarkan pengecualian — semak sendiri.
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “java.net.http.HttpClient” percuma?

Ya — teks penuh “java.net.http.HttpClient” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “java.net.http.HttpClient”?

Hantar permintaan segerak Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “java.net.http.HttpClient” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. java.net.http.HttpClient
  2. Permintaan Tak Segerak
  3. Badan Permintaan dan Pengepala
  4. Mengendalikan Respons
← Kembali ke Java Academy