在JAVA中合并两个URL

时间:2012-04-27 10:22:02

标签: java url browser rfc

我使用以下代码合并了两个url。

String strUrl1 = "http://www.domainname.com/path1/2012/04/25/file.php";
   String arg = "?page=2";
   URL url1;
    try {
        url1 = new URL(strUrl1);
        URL reconUrl1 = new URL(url1,arg);
        System.out.println(" url : " + reconUrl1.toString());
    } catch (MalformedURLException ex) {
        ex.printStackTrace();
    }

我对结果感到惊讶:http://www.domainname.com/path1/2012/04/25/?page=2

我希望它是(浏览器做什么):http://www.domainname.com/path1/2012/04/25/file.php?page=2

关于构造函数URL(URL上下文,String规范)的Tha javadoc解释它应该尊重RFC。

我做错了什么?

由于

更新:

This is the only problem I encountered with the fonction.
The code already works in all others cases, like browser do
  "domain.com/folder/sub" + "/test" -> "domain.com/test"
  "domain.com/folder/sub/" + "test" -> "domain.com/folder/sub/test"
  "domain.com/folder/sub/" + "../test" -> "domain.com/folder/test"
  ...

6 个答案:

答案 0 :(得分:2)

您始终可以先合并String,然后根据合并的String创建URL。

  StringBuffer buf = new StringBuffer();
  buf.append(strURL1);
  buf.append(arg);
  URL url1 = new URL(buf.toString());

答案 1 :(得分:1)

尝试

String k = url1+arg;
URL url1;
    try {
        url1 = new URL(k);
        //URL reconUrl1 = new URL(url1,arg);
        System.out.println(" url : " + url1.toString());
    } catch (MalformedURLException ex) {
        ex.printStackTrace();
    }

答案 2 :(得分:1)

我还没有通读the RFC,但是上下文(如URL的Java文档中所述)可能是URL的目录,这意味着

的背景
"http://www.domainname.com/path1/2012/04/25/file.php"

"http://www.domainname.com/path1/2012/04/25/"

这就是为什么

new URL(url1,arg);

产量

"http://www.domainname.com/path1/2012/04/25/?page=2"

“解决方法”显然是使用+自行连接各个部分。

答案 3 :(得分:1)

您正在使用此处的URL构造函数,该参数的参数为​​URL(URL context, String spec)。所以你不要传递带有URL的php页面,而是传递字符串。上下文需要是目录。正确的方法是

  String strUrl1 = "http://www.domainname.com/path1/2012/04/25";
  String arg = "/file.php?page=2";
  URL url1;
  try {
    url1 = new URL(strUrl1);
    URL reconUrl1 = new URL(url1,arg);
    System.out.println(" url : " + reconUrl1.toString());
 } catch (MalformedURLException ex) {
    ex.printStackTrace();
 }

答案 4 :(得分:0)

试试这个

String strUrl1 = "http://www.domainname.com/path1/2012/04/25/";
       String arg = "file.php?page=2";
       URL url1;
        try {
            url1 = new URL(strUrl1);
            URL reconUrl1 = new URL(url1,arg);
            System.out.println(" url : " + reconUrl1.toString());
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }

答案 5 :(得分:0)

当您阅读java文档时,它会提到指定URL的上下文 哪个是域名和路径:

"http://www.domainname.com"  +  "/path1/2012/04/25/"

"file.php"被认为是上述背景所属的文本 这个两个参数重载的构造函数使用URL的上下文作为基础,并添加第二个参数来创建一个完整的URL,这不是你需要的。

所以最好将String添加两部分,然后从中创建URL:

   String contextURL = "http://www.domainname.com/path1/2012/04/25/";
   String textURL = "file.php?page=2";
   URL url;
    try {
        url = new URL(contextURL);
        URL reconUrl = new URL(url, textURL);
        System.out.println(" url : " + reconUrl.toString());
    } catch (MalformedURLException murle) {
        murle.printStackTrace();
    }