Добавление карты httpheaders в builder

#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);