【问题标题】:Micronaut HttpClient: Correct way to handle spaces in URIsMicronaut HttpClient:处理 URI 中空格的正确方法
【发布时间】:2019-01-22 01:25:02
【问题描述】:

我正在使用带有 Java8 的 micronaut 1.0.3。我试图了解 HttpClient 何时以及如何需要编码。

第一个问题:

当我在 URI 中使用带有空格的 HttpClient 时,出现错误:java.lang.IllegalArgumentException: Illegal character in path at index 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 进行编码的正确方法是什么?

https://github.com/gboersma/http-client-encoding-issue 的示例项目。

【问题讨论】:

    标签: micronaut


    【解决方案1】:

    原来确实需要对 URI 进行编码。有一个实用程序类 UriBuilder 用于生成编码 URL。在这种情况下,正确的使用方式是UriBuilder.of("/{parameter}”).expand(parameter, ‘bleah bleah’).toString()

    感谢 Sergio del Amo 澄清这一点。

    【讨论】:

      【解决方案2】:

      首先回答你的第一个问题:当然你应该对URL中的空格进行编码,但是HttpClient不会自动帮你,你可以使用java的replace方法来替换空格; 至于第二个,我不知道真正的原因,但是用%20替换空格是一种习惯操作,就像用%23替换'#'一样,没必要追根究底

      【讨论】:

      • 您可以edit 回复以使其看起来更好,它使用markdown,编辑器上的这些按钮也会帮助您。
      • 注意,逗号、冒号等标点后请加空格;这将使您的文本更易于阅读。您还可以使用backticks 标记代码引用。
      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2010-12-08
      • 2011-02-28
      相关资源
      最近更新 更多