java - 在 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
知道我做错了什么吗?
非常感谢!
解决方案
替换这个:
HttpUrl theURL = HttpUrl.get(URI.create(url));
有了这个:
HttpUrl theURL = HttpUrl.get(url);
转换为 URI 然后转换为 HttpUrl 是不一样的,因为 URI 在转义方面非常激进(并且不正确)。
推荐阅读
- kubectl - 未找到 eksctl 管理的 CloudFormation 堆栈 > 错误:为集群加载 VPC 规范,
- python - 我如何在 Atom 中获取 python Discord 模块?
- javascript - 如何将 DATA 变量从 JS 导入新的 VUE3 组件,然后在 html DOM 中打印数据?:)
- docker - 云 NAT 配置失败?
- python - 制作python包
- python - 如何在 python 中使用文本到语音转换器远程播放声音
- ios - Flutter后台服务不工作ios
- excel - Excel 在 csv 文件上添加不需要的引号
- reactjs - React Query - 为什么我的分页查询没有被触发?
- mysql - 将 mysql 连接到 Visual Studio