URL 在 Java 中使用 OkHttp 编码

URL Encoding with OkHttp in Java

我目前正在实施一个调用某些 Web 服务的项目,并且我正在使用 OkHttp version 2.7.5

我项目的一部分是将数据从一个端点传输到另一个端点,这意味着在一端验证和获取数据,然后验证并posting/putting它到另一端。 当从一个特定端点获取数据时,我首先必须请求我想要的数据。然后端点 returns 一个“结果集”标记。在第二次调用中,我将此标记作为查询参数提交,然后我获得了实际数据。

这是我的问题所在:

我收到的令牌有时包含特殊字符,例如“+”。不幸的是,这会产生一个问题,因为我创建的 HttpUrl 对象总是将其编码为“%20”。这会更改令牌,无法再获取数据。

我基本上是这样做的:

    String url = "https://myhost.azure.com:444/api/v1/object?resultSet=FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf+4tuKRa7J1fn+QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw==";
    myLog.info("1.:" + url);

    HttpUrl theURL = HttpUrl.get(URI.create(url));
    myLog.info("2.:" + theURL.toString());

输出结果如下:

17:42:55.651 [main] INFO  basics.ws.App - 1.:https://myhost.azure.com:444/api/v1/object?resultSet=FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf+4tuKRa7J1fn+QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw==
17:42:55.661 [main] INFO  basics.ws.App - 2.:https://myhost.azure.com:444/api/v1/object?resultSet=FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf%204tuKRa7J1fn%20QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw==

如您所见,两个网址并不相同。我有点确定我只是犯了一个愚蠢的编码错误,但我在这里找不到解决方案。

我也尝试过自己构建整个 HttpUrl,但这也没有用:

    HttpUrl theURL2 = new HttpUrl.Builder()
            .scheme("https")
            .host("myhost.azure.com")
            .port(444)
            .addPathSegment("api")
            .addPathSegment("v1")
            .addPathSegment("object")
            .addEncodedQueryParameter("resultSet", "FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf+4tuKRa7J1fn+QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw==")
            .build();
    myLog.info("3.:" + theURL2.toString());

输出(用之前提到的代码看看区别)

17:55:21.856 [main] INFO  basics.ws.App - 1.:https://myhost.azure.com:444/api/v1/object?resultSet=FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf+4tuKRa7J1fn+QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw==
17:55:21.866 [main] INFO  basics.ws.App - 2.:https://myhost.azure.com:444/api/v1/object?resultSet=FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf%204tuKRa7J1fn%20QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw==
17:55:21.866 [main] INFO  basics.ws.App - 3.:https://myhost.azure.com:444/api/v1/object?resultSet=FYBGDD4eDan7aHbTGYruWR0OUBvKU9vgLxnf%204tuKRa7J1fn%20QC9TZ9sKjfQA46xD8/4CglY0AuGwNhF12Hmw%3D%3D

知道我做错了什么吗?

非常感谢!

替换为:

HttpUrl theURL = HttpUrl.get(URI.create(url));    

有了这个:

HttpUrl theURL = HttpUrl.get(url);

转换为 URI 然后转换为 HttpUrl 是不一样的,因为 URI 在转义方面非常激进(而且不正确)。