如何像浏览器一样在 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_urlrel_urlString)。在我的情况下,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 一样全屏显示?

如何让 extjs 组合框像普通的 html 选择框一样工作?

java中如何点击按钮跳转到网页(在浏览器中打开)

像导航抽屉一样切换片段(带后退箭头)

将 URL 路径与 path.Join() 组合