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
sendpe firul interfeței grafice. Blochează aplicația până la răspuns; foloseștesendAsync.
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.