Java Academy · Oppitunti

java.net.http.HttpClient

Lähetä synkronisia pyyntöjä.

Oppitunti 1/413 vaihetta

java.net.http.HttpClient on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Nykyaikainen HTTP-asiakas

Java 11:stä lähtien JDK sisältää java.net.http-paketissa nykyaikaisen HTTP-asiakkaan. Se korvaa vanhan HttpURLConnection-luokan selkeällä ja sujuvalla API-rajapinnalla, joka tukee HTTP/1.1:tä ja HTTP/2:ta.

Kolme keskeistä tyyppiä ovat:

  • HttpClient — lähettää pyyntöjä ja hallitsee asetuksia (aikakatkaisut, välityspalvelimet ja uudelleenohjaukset).
  • HttpRequest — muuttumaton kuvaus lähetettävästä pyynnöstä.
  • HttpResponse — tulos, joka sisältää tilakoodin, otsakkeet ja rungon.

HttpClientin luominen

Asiakas rakennetaan staattisella newBuilder()-metodilla. Yhtä asiakasta voi käyttää uudelleen moniin pyyntöihin, ja se on säieturvallinen.

Tässä määritetään HTTP/2 ja yhteyden muodostamisen aikakatkaisu. newHttpClient() on myös käytettävissä nopeasti luotavaa oletusinstanssia varten.

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

Pyynnön muodostaminen

HttpRequest on muuttumaton, ja se muodostetaan ketjutettavalla builderilla. Vähintään on annettava URI; oletuksena se suorittaa GET-pyynnön.

Merkkijono muunnetaan URI:ksi komennolla 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());
    }
}

Synkroninen lähetys

send-metodi estää kutsuvan säikeen toiminnan, kunnes vastaus saapuu. Se tarvitsee BodyHandler-käsittelijän, joka kertoo asiakkaalle, miten vastausrunkotulkitaan.

BodyHandlers.ofString() lukee rungon String-merkkijonoksi.

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

Tilakoodin lukeminen

Vastaus tarjoaa statusCode()-metodin, joka palauttaa int-arvon. 2xx-alueen koodit tarkoittavat onnistumista, 3xx-koodit uudelleenohjausta, 4xx-koodit asiakasvirheitä ja 5xx-koodit palvelinvirheitä.

Huomautus: HTTP-asiakas ei koskaan heitä poikkeusta 4xx- tai 5xx-vastauksesta — tilakoodi on tarkistettava itse.

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

Rungon lukeminen

BodyHandlers.ofString()-käsittelijää käytettäessä response.body() palauttaa String-merkkijonon. Muita käsittelijöitä on saatavilla tavuille, tiedostoille ja tietovirroille (niitä käsitellään myöhemmin).

Tämä koodikatkelma simuloi vastaanotettavaa rungon sisältöä.

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

Uudelleenohjausten käsittely

Oletusarvoisesti asiakas ei seuraa uudelleenohjauksia. Määritä tämä builderilla komennolla followRedirects(...).

Luokan HttpClient.Redirect vaihtoehdot ovat NEVER, ALWAYS ja NORMAL (seuraa uudelleenohjauksia lukuun ottamatta HTTPS-yhteyden vaihtamista HTTP-yhteydeksi).

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

Pyyntökohtaiset aikakatkaisut

Yhteyden aikakatkaisu määritetään asiakkaassa. Pyynnön aikakatkaisu (kuinka kauan vastausta odotetaan) määritetään pyynnössä komennolla timeout(...).

Jos aikakatkaisu umpeutuu, send heittää HttpTimeoutException-poikkeuksen.

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

Vastausotsakkeiden tarkastelu

Vastaus sisältää HttpHeaders-olion, joka on käytettävissä komennolla headers(). Otsakkeiden haut eivät erottele kirjainkokoa, ja otsakkeella voi olla useita arvoja, joten firstValue(...) palauttaa Optional<String>-arvon.

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

Tarkistetut poikkeukset

Synkroninen send ilmoittaa kaksi tarkistettua poikkeusta:

  • IOException — verkko- tai protokollavirhe.
  • InterruptedException — estetty säie keskeytettiin.

Molemmat poikkeukset on käsiteltävä tai ilmoitettava. Asynkroniset kutsut (seuraava oppitunti) välttävät tämän palauttamalla futuurin.

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

Uudelleenkäytettävä asiakas

Suositeltu käytäntö: luokaa yksi HttpClient ja käyttäkää sitä uudelleen koko sovelluksessa. Se ylläpitää yhteyspoolia ja on täysin säieturvallinen.

Uuden asiakkaan luominen jokaista pyyntöä varten kuluttaa resursseja turhaan ja estää HTTP/2:n multipleksoinnin hyödyntämisen.

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

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte synkronisen HTTP-asiakkaan toiminnan.

Kertaus

Opitte JDK:n HTTP-asiakkaan perusteet:

  • HttpClient.newBuilder() määrittää version, aikakatkaisun ja uudelleenohjaukset; käyttäkää yhtä instanssia uudelleen.
  • HttpRequest.newBuilder().uri(...).GET() muodostaa muuttumattoman pyynnön.
  • client.send(request, BodyHandlers.ofString()) estää suorituksen ja palauttaa HttpResponse<String>-olion.
  • Lukekaa tulokset metodeilla statusCode(), body() ja headers().
  • Muut kuin 2xx-koodit eivät aiheuta poikkeusta — tarkistakaa ne itse.
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”java.net.http.HttpClient” ilmainen?

Kyllä – oppitunnin ”java.net.http.HttpClient” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”java.net.http.HttpClient”?

Lähetä synkronisia pyyntöjä. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”java.net.http.HttpClient”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. java.net.http.HttpClient
  2. Asynkroniset pyynnöt
  3. Pyyntörungot ja otsakkeet
  4. Vastausten käsittely
← Takaisin: Java Academy