java.net.http.HttpClient
Lähetä synkronisia pyyntöjä.
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()jaheaders(). - Muut kuin 2xx-koodit eivät aiheuta poikkeusta — tarkistakaa ne itse.
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
- java.net.http.HttpClient
- Asynkroniset pyynnöt
- Pyyntörungot ja otsakkeet
- Vastausten käsittely