我在Java8上使用micronaut 1.0.3。我试图了解HttpClient何时以及如何需要编码。
第一个问题:
当我将HttpClient与URI中的空格一起使用时,出现错误:java.lang.IllegalArgumentException:索引6处路径中的非法字符:/ bleah bleah
问题:我需要对URI进行编码吗?我希望HttpClient可以为我做这件事。
第二个问题:
我尝试使用Java的URLEncoder进行编码,该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不匹配?编码网址的正确方法是什么?
在https://github.com/gboersma/http-client-encoding-issue处进行示例项目。
答案 0 :(得分:0)
结果证明URI确实需要编码。有一个实用程序类UriBuilder
,用于生成编码的URL。在这种情况下,正确的使用方式类似于UriBuilder.of("/{parameter}”).expand(parameter, ‘bleah bleah’).toString()
。
感谢塞尔吉奥·德尔阿莫(Sergio del Amo)澄清了这一点。
答案 1 :(得分:-1)
首先回答您的第一个问题:当然您应该在URL中对空格进行编码,但是HttpClient不会自动为您提供帮助,您可以使用java的replace方法来替换空格; 其次,我不知道真正的原因,但是使用%20替换空格是一种常规操作,就像使用%23替换'#'一样,没有必要深入探讨< / p>