首页 > 解决方案 > 在 Java 中使用 OkHttp 进行 URL 编码

问题描述

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

我的项目的一部分是将数据从一个端点传输到另一个端点,这意味着在一端进行身份验证和获取数据,然后进行身份验证并将其发布/放置到另一个端点。从一个特定端点获取数据时,我首先必须请求我想要的数据。然后端点返回一个“结果集”令牌。在第二次调用中,我将此令牌作为查询参数提交,然后我获取实际数据。

这就是我的问题出现的地方:

我收到的令牌有时包含特殊字符,例如“+”。不幸的是,这会产生一个问题,因为我创建的 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==

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

我也尝试自己构建整个 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

知道我做错了什么吗?

非常感谢!

标签: javaurlencodingparametersokhttp

解决方案


替换这个:

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

有了这个:

HttpUrl theURL = HttpUrl.get(url);

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


推荐阅读