如何像浏览器一样在 Java 中组合 URL 片段?
Posted
技术标签:
【中文标题】如何像浏览器一样在 Java 中组合 URL 片段?【英文标题】:How do you combine URL fragments in Java the same way browsers do? 【发布时间】:2012-01-04 20:42:11 【问题描述】:注意:我问的是现实世界的问题,而不是理论目的;查看问题的最后一部分——浏览器的工作方式相同。
通常你会看到答案:
new java.net.URL(new java.net.URL(base_url),rel_url).toString
(base_url 和 rel_url 是 String)。在我的情况下,base_url 是我获取的页面的 URL,rel_url 来自“
但是这样的代码不适用于 URL 片段,比如这样的两个片段:
htpp://www.hello.com/1.html
?p=2
我测试了 Firefox、Chromium、Opera、Konqueror、“Web 浏览器”(Gnome 谦虚;-D)——它们都将这些 URL 组合为:
htpp://www.hello.com/1.html?p=2
使用上面的代码,我得到:
htpp://www.hello.com/?p=2
问题
您如何组合 URL 片段,以适应世界的方式?
我希望在我开始自己解析之前已经有方便的库了 ;-)。
【问题讨论】:
@JamesBlack: 如果rel_url
以../
开头怎么办?
连接字符串? ?p=2
不是 URL。
@Dᴀᴠᴇ Nᴇᴡᴛᴏɴ,适用于网络浏览器。我要求的是处理现实世界的解决方案,而不是理论。
@macias 只是为了验证一下,rel_url 的内容是什么?
@macias 不,戴夫是正确的。 "?p=2" 不是一个 URL 可以这么说。它可以是 URL 的一部分。我还建议连接字符串,然后将它们转换为 URL。
【参考方案1】:
您误解了什么是 URL。 ?p=2
是一个查询字符串,而不是一个相对 URL。 (您还可以找到#foo
,通常称为片段标识符 或引用,最常用于跳转到长文档的某个部分)。 URI 的完整方案是 described on Wikipedia 以及许多其他地方(您还可以在不同的地方找到 URI 和 URL 之间的区别)。
无论如何,相对 URL只引用 URL 的路径部分——它是路径是绝对的还是相对的。如果您有查询字符串并希望将其附加到现有 URL(没有查询字符串),只需将其附加到字符串。如果不知道是否有查询字符串,可以使用 URL 类中的方法进行测试。
如果你想复制浏览器的功能,给定一个完整的 URL url
和一个字符串 s
,
if (s.startsWith("?") || s.startsWith("#")) new java.net.URL(url.toString + s)
else new java.net.URL(url, s)
应该可以解决问题。 (我不知道不同浏览器使用的确切代码,但这复制了您描述的附加查询字符串的行为,如果这是在 href 中提供的全部内容。)如果您不知道您现有的 URL 是否可能有没有查询字符串,那么你可以
if (s.startsWith("#")) new java.net.URL(url.toString.takeWhile(_ != '#') + s)
else if (s.startsWith("?")) new java.net.URL(url.toString.takeWhile(_ != '?') + s)
else new java.net.URL(url, s)
【讨论】:
你为什么认为我什么都不懂?我有这样对的“流”,我已经将它们组合起来。我重新命名了这个问题,以避免进一步偏离主题的 cmets。所以你的答案很简单——没有饼干,DIY。答案当然可以,但我希望已经存在一些东西(毕竟是 2011 年),组合这些片段不是火箭科学,但很容易出错。 (问题已更新) @macias - 我认为 Java 中没有 cookie;我相信你可以找到一些图书馆。我的抱怨是你使用了错误的术语,然后抱怨使用正确术语的库没有做你想要的。 说不是抱怨,我是认真的。我正在寻找完成这项工作的工具,仅此而已。谢谢你的代码!以上是关于如何像浏览器一样在 Java 中组合 URL 片段?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android tv中使用像netflix这样的浏览片段制作侧边菜单?
如何让 WKWebView 像 SFSafariViewController 一样全屏显示?