Micronaut HttpClient: правильный способ обработки пробелов в URI

Я использую 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.


person gooboo    schedule 21.01.2019    source источник


Ответы (2)


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

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

person gooboo    schedule 21.01.2019

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

person 紫色菩提    schedule 21.01.2019
comment
Вы можете отредактировать ответ, чтобы он выглядел лучше, он использует markdown, а также эти кнопки в редакторе помогут вам. - person Tiw; 21.01.2019