如何在Java中组合URL片段与浏览器相同?

时间:2011-11-23 14:51:30

标签: java url scala browser

注意我在问现实世界的问题,不是出于理论目的;看到问题的最后一部分 - 与浏览器完成工作的方式相同。

<小时/> 通常你会看到答案:

new java.net.URL(new java.net.URL(base_url),rel_url).toString

base_url rel_url 字符串)。在我的情况下, base_url 是我获取的网页的网址, rel_url 来自“&lt; a href = ...”值,因此它可能是单个“#”字符(例如)。

但是这样的代码不适用于URL片段,例如这两部分:

  

HTPP://www.hello.com/1.html

     

?p = 2时

我测试了Firefox,Chromium,Opera,Konqueror,“Web浏览器”(Gnome modesty ;-D) - 所有这些都将这些URL组合为:

  

HTPP://www.hello.com/1.html P = 2

使用上面的代码我得到:

  

HTPP://www.hello.com/ P = 2

问题

如何以准备好的世界方式组合网址片段?

我希望在我开始自己解析之前已经有了方便的库了; - )。

1 个答案:

答案 0 :(得分:7)

您误解了URL是什么。 ?p=2查询字符串,而不是相对网址。 (您还可以找到#foo,它通常称为片段标识符引用,最常用于跳转到长文档的一部分)。在许多其他地方,URI的完整方案是described on Wikipedia(您还可以在不同的地方找到URI和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)