HttpResponse în Java

Răspunsul la o cerere HTTP: statusCode() dă codul (200, 404…), body() corpul, headers() antetele.

Sintaxă
import java.net.http.HttpResponse;

int statusCode()
T body()
HttpHeaders headers()
URI uri()
HttpClient.Version version()

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ă verifici statusCode(). 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ște orElse.

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.