Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

HttpResponse

Ответ сервера: код статуса, заголовки и тело того типа, который задал BodyHandler.

Доступно с: Java 11

Синтаксис

public interface HttpResponse<T>

Примеры

Код, заголовок и тело. Ответ 404 не вызывает исключения:

import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.*;
 
void main() throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
    server.createContext("/", exchange -> {
        byte[] body = "{\"error\": \"not found\"}".getBytes();
        exchange.getResponseHeaders().add("Content-Type", "application/json");
        exchange.sendResponseHeaders(404, body.length);
        exchange.getResponseBody().write(body);
        exchange.close();
    });
    server.start();
    URI uri = URI.create("http://localhost:" + server.getAddress().getPort() + "/missing");
 
    try (HttpClient client = HttpClient.newHttpClient()) {
        HttpResponse<String> response = client.send(
            HttpRequest.newBuilder(uri).build(), HttpResponse.BodyHandlers.ofString());
 
        IO.println(response.statusCode());
        IO.println(response.headers().firstValue("Content-Type").orElse("none"));
        IO.println(response.body());
        if (response.statusCode() >= 400) {
            IO.println("Request failed");
        }
    }
    server.stop(0);
}

Результат:

404
application/json
{"error": "not found"}
Request failed

BodyHandlers.ofLines() отдаёт тело как поток строк:

import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.*;
 
void main() throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
    server.createContext("/log", exchange -> {
        byte[] body = "INFO start\nERROR disk full\nINFO stop".getBytes();
        exchange.sendResponseHeaders(200, body.length);
        exchange.getResponseBody().write(body);
        exchange.close();
    });
    server.start();
    URI uri = URI.create("http://localhost:" + server.getAddress().getPort() + "/log");
 
    try (HttpClient client = HttpClient.newHttpClient()) {
        HttpResponse<Stream<String>> response = client.send(
            HttpRequest.newBuilder(uri).build(), HttpResponse.BodyHandlers.ofLines());
        response.body().filter(line -> line.startsWith("ERROR")).forEach(IO::println);
    }
    server.stop(0);
}

Результат:

ERROR disk full

Примечания

Тип тела задаёт обработчик из BodyHandlers: ofString() — строка, ofLines() — поток строк, ofByteArray() — байты, ofFile(path) — сразу в файл, discarding() — тело не нужно. Коды 4xx и 5xx исключений не вызывают, поэтому всегда проверяйте statusCode(). Заголовки читают через headers().firstValue(name) — он возвращает Optional. JSON в объект превращают отдельной библиотекой, например Jackson.

См. также

  • HttpClient — Встроенный HTTP-клиент: отправляет запросы синхронно (send) или асинхронно (sendAsync).
  • HttpRequest — Неизменяемый HTTP-запрос: адрес, метод, заголовки и тело. Создаётся через newBuilder().
  • Optional — Контейнер, в котором либо есть значение, либо его нет, — замена возврату `null`.

В учебнике

  • HTTP-клиент — Запросы к веб-серверам из Java — HttpClient, HttpRequest и HttpResponse.BodyHandlers, GET и POST с JSON, коды ответа и асинхронный sendAsync.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.