#java
#java
Вопрос:
Я создаю a HttpRequest
, в котором я хочу предоставить запросу карту заголовков : Map<String, List<String>>
.
Проблема HttpRequest
Builder принимает заголовки только как ключевое (строковое) значение (String), а не как целую карту. Как я могу предоставить содержимое карты headers
в builder?
HttpRequest httpRequest = java.net.http.HttpRequest.newBuilder()
.uri(URI.create("google.com"))
.headers("String", "String")
.GET()
.build();
Комментарии:
1. Есть
header
метод — см. Javadoc.
Ответ №1:
В документах говорится, что есть еще один ovlerload headers(String... headers)
. Он добавляет заданные пары значений name к набору заголовков для этого запроса. Предоставленные экземпляры String должны чередоваться как имена заголовков, так и значения заголовков. Чтобы добавить несколько значений к одному и тому же имени, одно и то же имя должно быть указано с каждым новым значением.
Вам нужно будет преобразовать карту Map<String, List<String>>
, скажем {«a» -> (1,2), «b»-> 3} в строку[] {«a», 1, «a», 2, «b», 3}}
Выравнивание карты в массив должно работать следующим образом:
public static String[] flattenMap(Map<String, List<String>> m) {
return m.entrySet().stream().flatMap(x ->
x.getValue().stream().flatMap(y -> Stream.of(x.getKey(), y)))
.toArray(String[]::new);
}
Ответ №2:
Или
public static HttpRequest.Builder addHeaders(HttpRequest.Builder builder, Map<String, List<String>> headers) {
for (Map.Entry<String, List<String>> e : headers.entrySet()) {
for (String value : e.getValue()) {
builder.header(e.getKey(), value);
}
}
return builder;
}
С меньшим количеством «магии» flatMap 🙂
Ответ №3:
Вы можете сделать что-то подобное:
Map<String, String> HEADERS = Map.of("Authorization", "Basic xyz==");
HttpRequest.Builder httpRequest = HttpRequest.newBuilder(URI.create("example.com"));
HEADERS.forEach(httpRequest::header);