【问题标题】:okhttp client truncates http URL at # signokhttp 客户端在 # 符号处截断 http URL
【发布时间】:2021-08-23 22:51:43
【问题描述】:

我正在使用 okhttp 客户端(版本 3.10.0)来调用 Bing 服务。测试中使用的地址有#号。

1177 公园大道 5 #190 橘园 佛罗里达州 320734150 美国

http 客户端在# 符号处截断地址部分。通过代码构造的 URL 是

https://dev.virtualearth.net/REST/v1/Locations/1177%20PARK%20AVE%20STE%205?%20maxresults=1&key=XXXXXXXXXXXXXXXXXXXXXXX&o=xml

代码片段如下所示

Request.Builder builder = bingOkHttpClient.newRequestBuilder(path, buildQueryParams());
builder.addHeader("Accept","application/xml");
bingOkHttpClient.newCall(builder.build()).execute();

如果我将 # 替换为套件,则 url 构造正确

https://dev.virtualearth.net/REST/v1/Location1s/177%20PARK%20AVE%20STE%205%20suite#20190%ORANGE%20PARK%20FL%320734150%US?maxresults=1&key=XXXXXXXXXXXXXXXXXXXXX&o=xml

有没有其他方法可以使使用 # 构造的 url 不被截断?

【问题讨论】:

  • 由于 # 用于引用 HTML 页面上的元素并且没有浏览器将其发送到服务器而是在本地处理它,我相信您必须自己对整个路径进行 URL 编码。作为快速修复,您可以尝试将# 替换为%23,这是它在URL 编码中的表示。但是,不知道这是否可行; okhttp 可能会自行对 % 进行编码,这会破坏 URL。

标签: java spring-boot okhttp


【解决方案1】:

某些符号(包括“#”)不是有效的 URL 符号。如果您的 URL 需要包含它们,则需要对其进行编码。因此,获取您的原始 URL 字符串并使用方法URLEncoder.encode(...) 对其进行编码这是URLEncoder 的Javadoc

【讨论】:

  • 你能确认 okhttp 不会对 URL 进行编码吗? (也就是说,无需对 OP 的代码进行其他修改。)这会破坏整个 URL...
  • 我相信 okhttp(或任何其他 http 客户端)不会对 URL 进行编码。我不能保证,但你可以很容易地测试它。对您的 URL 进行编码并查看它是否有效。如果是这样,那么您的编码会有所不同,这意味着 okhttp 没有自行对其进行编码。在任何情况下,带有 # 等符号和其他无效符号的 URL 都被认为是严格意义上的非法 URL。所以,无论如何你真的应该编码它。它已经部分编码,因为您使用 %20 而不是空格
  • 是的,这有帮助。有编码逻辑可以用 %20 替换空格。我删除了该代码块并使用了 URLEncoder.encode(...) 方法。有效。我看到 Bing 服务的反应很好。根据 usps.com,# 是美国邮政地址行中的有效字符。感谢您的解决方案。
  • 我确认 okHttp 客户端没有编码 URL。
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 2014-08-10
  • 2019-01-20
  • 2012-12-19
  • 1970-01-01
  • 2018-05-17
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多