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.sendprimește unHttpRequest, nu unBuilder. - Trimiți JSON fără antetul
Content-Type: application/json. Multe servere refuză sau nu înțeleg corpul. - Pui manual antete interzise, ca
HostsauContent-Length.headeraruncă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.