Как создать URI / URL, используя MultiValueMap для параметров? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть несколько карт параметров, например:

{
    keyA: ["2+4", "4+8"],
    keyB: ["Some words with special chars #ąęć"]
}

как весна MultiValueMap, и я пытаюсь создать URI из этого, я пытался использовать

URI uri = UriComponentsBuilder
           .fromUriString(baseUri).path(somePath)
           .queryParams(params.getQueryParameters())
           .build().encode().toUri();

Кажется, он работает для специальных символов, но он все еще думает, что знак + - это пробел, я хочу закодировать все параметры, существует ли решение для этого, кроме ручного кодирования каждого значения?

1 Ответ

0 голосов
/ 31 октября 2018

Если вы используете Spring 5.0, это подробно обсуждается в [SPR-16860] Spring несовместим с проблемой кодирования / декодирования URL . Более или менее все сводится к следующему:

С точки зрения RFC 3986, "+" является юридическим символом. По умолчанию RestTemplate оставляет его как есть.

UriComponents.encode() оставит + подписанным как есть, чтобы остаться жалобой с RFC 3986. Если вам нужно это закодировать, одно из предложений - использовать UriUtils:

String value = "A+B=C";
value = UriUtils.encode(value, StandardCharsets.UTF_8); // A%2BB%3DC
URI uri = UriComponentsBuilder.newInstance()
       .queryParam("test", value)
       .build(true)
       .toUri();

Существует изменение, появившееся 5.0.8 как часть [SPR-17039] Поддержка более строгого кодирования переменных URI в UriComponents , в котором представлен новый метод UriComponentsBuilder.encode(). В вашем примере должно быть достаточно переместиться на encode() до build():

URI uri = UriComponentsBuilder
       .fromUriString(baseUri).path(somePath)
       .queryParams(params.getQueryParameters())
       .encode()
       .build()
       .toUri();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...