Micronaut HttpClient: правильный способ обработки пробелов в URI - PullRequest
0 голосов
/ 21 января 2019

Я использую micronaut 1.0.3 с Java8.Я пытаюсь понять, когда и как требуется кодировка для HttpClient.

Первая проблема:

Когда я использую HttpClient с пробелами в URI, я получаю сообщение об ошибке: java.lang.IllegalArgumentException:Недопустимый символ в пути с индексом 6: / bleah bleah

Вопрос. Нужно ли кодировать URI?Я ожидаю, что HttpClient сделает это для меня.

Вторая проблема:

Я пытаюсь кодировать, используя Java URLEncoder, который преобразует пространство в +.Это не соответствует конечной точке на сервере.На сервере я получаю следующее:

18:26:02.261 [nioEventLoopGroup-1-9] DEBUG i.m.h.server.netty.NettyHttpServer - Server localhost:8081 Received Request: GET /bleah+bleah
18:26:02.261 [nioEventLoopGroup-1-9] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Matching route GET - /bleah+bleah
18:26:02.262 [nioEventLoopGroup-1-9] DEBUG i.m.h.s.netty.RoutingInBoundHandler - No matching route found for URI /bleah+bleah and method GET
18:26:02.262 [nioEventLoopGroup-1-9] DEBUG i.m.h.s.netty.RoutingInBoundHandler - Encoding emitted response object [Page Not Found] using codec: io.micronaut.jackson.codec.JsonMediaTypeCodec@4a8b5227

Если я кодирую пробелы с использованием% 20, все работает хорошо.

Вопрос: почему URL-адрес не совпадает?Как правильно кодировать URL?

Пример проекта на https://github.com/gboersma/http-client-encoding-issue.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Оказывается, что URI нужно кодировать. Существует служебный класс UriBuilder, который используется для генерации закодированных URL-адресов. В этом случае правильный способ его использования - что-то вроде UriBuilder.of("/{parameter}”).expand(parameter, ‘bleah bleah’).toString().

Спасибо Серхио дель Амо за разъяснение этого вопроса.

0 голосов
/ 21 января 2019

Сначала ответьте на свой первый вопрос: Конечно, вы должны закодировать пробел в URL, но HttpClient не поможет вам автоматически, вы можете использовать метод замены java, чтобы заменить пробел;Во-вторых, я не знаю истинной причины, но использование% 20 вместо пробела является обычной операцией, так же, как использование% 23 вместо '#', не обязательно разбираться в сути вопроса

...