Ce face HttpResponse
HttpResponse<T> este ce primești de la send sau sendAsync. statusCode() returnează codul de stare: 2xx succes (200 OK, 201 Created), 3xx redirecționare, 4xx greșeala clientului (400, 401, 404), 5xx eroare a serverului (500, 503).
body() returnează corpul, cu tipul ales prin BodyHandler: String pentru ofString(), byte[] pentru ofByteArray(), Path pentru ofFile. headers() dă antetele; firstValue("content-type") returnează un Optional, iar numele antetelor nu țin cont de litere mari sau mici.
Ce returnează
statusCode(): un int; body(): un obiect de tipul T.
Exemple
Exemplul 1: Cod, antet și corp
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("/produs/42", schimb -> {
byte[] corp = "{\"nume\":\"Caiet A4\",\"pret\":7.5}".getBytes(StandardCharsets.UTF_8);
schimb.getResponseHeaders().set("Content-Type", "application/json; charset=utf-8");
schimb.getResponseHeaders().set("X-Stoc", "128");
schimb.sendResponseHeaders(200, corp.length);
try (OutputStream out = schimb.getResponseBody()) {
out.write(corp);
}
});
server.start();
URI adresa = URI.create("http://127.0.0.1:" + server.getAddress().getPort() + "/produs/42");
try (HttpClient client = HttpClient.newHttpClient()) {
HttpResponse<String> r = client.send(HttpRequest.newBuilder(adresa).build(), HttpResponse.BodyHandlers.ofString());
System.out.println("statusCode: " + r.statusCode());
System.out.println("Content-Type: " + r.headers().firstValue("content-type").orElse("-"));
System.out.println("Stoc: " + r.headers().firstValue("x-stoc").orElse("necunoscut"));
System.out.println("body: " + r.body());
System.out.println("Versiune: " + r.version());
}
server.stop(0);
}
}
Rezultat
statusCode: 200
Content-Type: application/json; charset=utf-8
Stoc: 128
body: {"nume":"Caiet A4","pret":7.5}
Versiune: HTTP_1_1
Exemplul 2: Decizii după codul de stare
import com.sun.net.httpserver.HttpServer;
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 {
static String descrie(int cod) {
if (cod >= 200 && cod < 300) return "succes";
if (cod == 404) return "nu există";
if (cod >= 400 && cod < 500) return "cerere greșită";
return "eroare de server";
}
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
server.createContext("/", schimb -> {
int cod = Integer.parseInt(schimb.getRequestURI().getPath().substring(1));
schimb.sendResponseHeaders(cod, -1);
schimb.close();
});
server.start();
String baza = "http://127.0.0.1:" + server.getAddress().getPort() + "/";
try (HttpClient client = HttpClient.newHttpClient()) {
for (int cod : new int[] {200, 204, 401, 404, 503}) {
HttpResponse<Void> r = client.send(HttpRequest.newBuilder(URI.create(baza + cod)).build(),
HttpResponse.BodyHandlers.discarding());
System.out.println(r.statusCode() + " -> " + descrie(r.statusCode()));
}
}
server.stop(0);
}
}
Rezultat
200 -> succes
204 -> succes
401 -> cerere greșită
404 -> nu există
503 -> eroare de server
Greșeli frecvente
- Folosești
body()fără să verificistatusCode(). La 404 sau 500 corpul este de obicei o pagină de eroare, nu datele așteptate. - Apelezi
headers().firstValue(...).get(). Dacă antetul lipsește, aruncă excepție; foloseșteorElse.
Comenzi înrudite
HttpClient.send: Trimite o cerere HTTP și așteaptă răspunsul; BodyHandlers.ofString() citește corpul ca text.HttpRequest: O cerere HTTP imutabilă (adresă, metodă, antete, corp), construită cu HttpRequest.newBuilder(uri)…build().HttpClient.sendAsync: Trimite o cerere HTTP fără să aștepte: returnează imediat un CompletableFuture cu răspunsul.Optional: O „cutie” care conține o valoare sau este goală. Arată clar că un rezultat poate lipsi și te obligă să tratezi cazul, în loc de null.