Класс HttpHeaders
Класс HttpHeaders представляет собой неизменяемую (immutable) коллекцию заголовков HTTP-запроса или HTTP-ответа. Он находится в пакете java.net.http и приходит в составе объектов HttpRequest и HttpResponse. Экземпляр класса нельзя создать напрямую через конструктор - объект возвращается методами headers у запроса или ответа. Заголовки хранятся в виде отображения, где ключом является имя заголовка, а значением - список строк, так как один и тот же заголовок может встречаться несколько раз. Класс реализует интерфейс Map<String, List<String>>, поэтому для чтения значений доступны стандартные методы map: get, firstValue, allValues, containsKey, keySet и другие.
Синтаксис
HttpHeaders headers = response.headers();
headers.firstValue("Content-Type");
headers.allValues("Set-Cookie");
headers.map();
Пример
Давайте получим заголовки ответа и выведем значение заголовка Content-Type через метод firstValue. Метод возвращает Optional<String>, поэтому для получения значения используем orElse:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpHeaders;
public class Main
{
public static void main(String[] args) throws Exception
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
HttpHeaders headers = response.headers();
String contentType = headers.firstValue("Content-Type")
.orElse("unknown");
System.out.println(contentType);
}
}
Результат выполнения кода:
"text/html; charset=UTF-8"
Пример
Давайте выведем все заголовки ответа, перебрав их через метод map, который возвращает отображение имя-значения:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpHeaders;
import java.util.List;
import java.util.Map;
public class Main
{
public static void main(String[] args) throws Exception
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
HttpHeaders headers = response.headers();
for (Map.Entry<String, List<String>> entry : headers.map().entrySet())
{
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
Результат выполнения кода:
"content-type: [text/html; charset=UTF-8]"
"content-length: [1256]"
"date: [Mon, 01 Jan 2024 12:00:00 GMT]"
Пример
Давайте получим заголовки собственного запроса. Обратите внимание, что при добавлении заголовка через метод header у HttpRequest.Builder имя заголовка автоматически приводится к нижнему регистру:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpHeaders;
import java.util.List;
public class Main
{
public static void main(String[] args) throws Exception
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.header("X-Custom-Header", "value1")
.header("X-Custom-Header", "value2")
.GET()
.build();
HttpHeaders headers = request.headers();
List<String> values = headers.allValues("x-custom-header");
System.out.println(values);
}
}
Результат выполнения кода:
[value1, value2]
Смотрите также
-
класс
HttpRequest,
который представляет HTTP-запрос -
класс
HttpResponse,
который представляет HTTP-ответ -
метод
header,
который добавляет заголовок в запрос -
метод
headers,
который возвращает заголовки ответа