HttpRequest în Java

O cerere HTTP imutabilă (adresă, metodă, antete, corp), construită cu HttpRequest.newBuilder(uri)…build().

Sintaxă
import java.net.http.HttpRequest;

static HttpRequest.Builder newBuilder()
static HttpRequest.Builder newBuilder(URI adresa)

HttpRequest cerere = HttpRequest.newBuilder(URI.create("https://…"))
    .header("Accept", "application/json")
    .timeout(Duration.ofSeconds(10))
    .POST(HttpRequest.BodyPublishers.ofString(json))   // sau GET(), PUT(...), DELETE()
    .build();

Ce face HttpRequest

HttpRequest descrie ce trimiți: adresa (URI), metoda (GET, POST, PUT, DELETE), antetele și corpul. Se construiește cu un builder: HttpRequest.newBuilder(uri), apoi metode înlănțuite, la final build(). Metoda implicită este GET.

Corpul unei cereri POST sau PUT se dă printr-un BodyPublisher: BodyPublishers.ofString(text), ofFile(cale), ofByteArray(octeti), noBody(). header(nume, valoare) adaugă un antet; timeout(durata) pune o limită pentru tot răspunsul.

Obiectul construit este imutabil și poate fi trimis de mai multe ori. Din Java 16, HttpRequest.newBuilder(cerereVeche, filtru) copiază o cerere existentă ca s-o modifici.

Parametri

Parametru Descriere
adresa Adresa cererii, ca URI.

Ce returnează

newBuilder returnează un HttpRequest.Builder; build() returnează HttpRequest.

Exemple

Exemplul 1: Ce conține o cerere construită

import java.net.URI;
import java.net.http.HttpRequest;
import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        HttpRequest cerere = HttpRequest.newBuilder(URI.create("https://api.exemplu.ro/elevi"))
            .header("Accept", "application/json")
            .header("Authorization", "Bearer abc123")
            .timeout(Duration.ofSeconds(10))
            .POST(HttpRequest.BodyPublishers.ofString("{\"nume\":\"Ioana\",\"clasa\":\"9B\"}"))
            .build();
        System.out.println("Metodă: " + cerere.method());
        System.out.println("Adresă: " + cerere.uri());
        System.out.println("Accept: " + cerere.headers().firstValue("Accept").orElse("-"));
        System.out.println("Timeout: " + cerere.timeout().orElseThrow());
        System.out.println("Lungime corp: " + cerere.bodyPublisher().orElseThrow().contentLength() + " octeți");
    }
}

Rezultat

Metodă: POST
Adresă: https://api.exemplu.ro/elevi
Accept: application/json
Timeout: PT10S
Lungime corp: 29 octeți

Exemplul 2: GET, PUT și DELETE către un server local

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("/elevi/7", schimb -> {
            String corpCerere = new String(schimb.getRequestBody().readAllBytes(), StandardCharsets.UTF_8);
            byte[] corp = (schimb.getRequestMethod() + " primit, corp: '" + corpCerere + "'").getBytes(StandardCharsets.UTF_8);
            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() + "/elevi/7");
        HttpRequest[] cereri = {
            HttpRequest.newBuilder(adresa).GET().build(),
            HttpRequest.newBuilder(adresa).PUT(HttpRequest.BodyPublishers.ofString("nota=10")).build(),
            HttpRequest.newBuilder(adresa).DELETE().build(),
        };
        try (HttpClient client = HttpClient.newHttpClient()) {
            for (HttpRequest c : cereri) {
                System.out.println(client.send(c, HttpResponse.BodyHandlers.ofString()).body());
            }
        }
        server.stop(0);
    }
}

Rezultat

GET primit, corp: ''
PUT primit, corp: 'nota=10'
DELETE primit, corp: ''

Greșeli frecvente

  • Uiți build() și încerci să trimiți builder-ul. send primește un HttpRequest, nu un Builder.
  • Trimiți JSON fără antetul Content-Type: application/json. Multe servere refuză sau nu înțeleg corpul.
  • Pui manual antete interzise, ca Host sau Content-Length. header aruncă IllegalArgumentException; clientul le pune singur.

Comenzi înrudite

  • HttpClient.send: Trimite o cerere HTTP și așteaptă răspunsul; BodyHandlers.ofString() citește corpul ca text.
  • HttpResponse: Răspunsul la o cerere HTTP: statusCode() dă codul (200, 404…), body() corpul, headers() antetele.
  • URI: O adresă (URL) verificată și împărțită în părți; URI.create(„https://…”) o creează și aruncă IllegalArgumentException dacă e greșită.
  • HttpClient: Clientul HTTP din Java 11: newHttpClient() îl creează, send/sendAsync trimit cereri și primesc răspunsuri.