HttpClient.send în Java

Trimite o cerere HTTP și așteaptă răspunsul; BodyHandlers.ofString() citește corpul ca text.

Sintaxă
<T> HttpResponse<T> send(HttpRequest cerere, HttpResponse.BodyHandler<T> handler)
    throws IOException, InterruptedException

Ce face HttpClient.send

send este varianta sincronă: blochează firul curent până sosește răspunsul complet. Al doilea argument, un BodyHandler, spune cum se citește corpul: BodyHandlers.ofString() ca text, ofByteArray() ca octeți, ofFile(cale) direct într-un fișier, discarding() îl ignoră.

Un cod de eroare HTTP (404, 500) nu aruncă excepție: primești un răspuns normal și verifici statusCode(). Excepții apar doar la probleme de rețea: ConnectException (serverul nu răspunde), HttpTimeoutException (a expirat timpul din HttpRequest.timeout), ambele subclase ale IOException.

Parametri

Parametru Descriere
cerere Un HttpRequest construit cu HttpRequest.newBuilder.
handler Cum se citește corpul: HttpResponse.BodyHandlers.ofString() etc.

Ce returnează

Un HttpResponse<T>, unde T depinde de handler (String pentru ofString).

Exemple

Exemplul 1: POST cu JSON și răspuns de la server

import com.sun.net.httpserver.HttpServer;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        server.createContext("/comenzi", schimb -> {
            String primit = new String(schimb.getRequestBody().readAllBytes(), StandardCharsets.UTF_8);
            byte[] corp = ("Am primit prin " + schimb.getRequestMethod() + ": " + primit).getBytes(StandardCharsets.UTF_8);
            schimb.sendResponseHeaders(201, corp.length);
            try (OutputStream out = schimb.getResponseBody()) {
                out.write(corp);
            }
        });
        server.start();
        URI adresa = URI.create("http://127.0.0.1:" + server.getAddress().getPort() + "/comenzi");

        try (HttpClient client = HttpClient.newHttpClient()) {
            HttpRequest cerere = HttpRequest.newBuilder(adresa)
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString("{\"client\":\"Ana\",\"produs\":\"caiet\"}"))
                .build();
            HttpResponse<String> r = client.send(cerere, HttpResponse.BodyHandlers.ofString());
            System.out.println("Stare: " + r.statusCode());
            System.out.println(r.body());
        }
        server.stop(0);
    }
}

Rezultat

Stare: 201
Am primit prin POST: {"client":"Ana","produs":"caiet"}

Exemplul 2: 404 nu aruncă excepție, serverul oprit da

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
        server.createContext("/", schimb -> {
            schimb.sendResponseHeaders(404, -1);
            schimb.close();
        });
        server.start();
        int port = server.getAddress().getPort();
        try (HttpClient client = HttpClient.newHttpClient()) {
            HttpRequest cerere = HttpRequest.newBuilder(URI.create("http://127.0.0.1:" + port + "/lipsa")).build();
            HttpResponse<Void> r = client.send(cerere, HttpResponse.BodyHandlers.discarding());
            System.out.println("Cod primit: " + r.statusCode());
            server.stop(0);
            try {
                client.send(cerere, HttpResponse.BodyHandlers.discarding());
            } catch (IOException e) {
                System.out.println("Server oprit: " + e.getClass().getSimpleName());
            }
        }
    }
}

Rezultat

Cod primit: 404
Server oprit: ConnectException

Greșeli frecvente

  • Crezi că un răspuns 404 sau 500 aruncă excepție. Verifică mereu statusCode().
  • Apelezi send pe firul interfeței grafice. Blochează aplicația până la răspuns; folosește sendAsync.

Comenzi înrudite

  • HttpClient: Clientul HTTP din Java 11: newHttpClient() îl creează, send/sendAsync trimit cereri și primesc răspunsuri.
  • HttpClient.sendAsync: Trimite o cerere HTTP fără să aștepte: returnează imediat un CompletableFuture cu răspunsul.
  • HttpRequest: O cerere HTTP imutabilă (adresă, metodă, antete, corp), construită cu HttpRequest.newBuilder(uri)…build().
  • HttpResponse: Răspunsul la o cerere HTTP: statusCode() dă codul (200, 404…), body() corpul, headers() antetele.