2

我将两个 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 上下文,字符串规范)的 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"
  ...
4

6 回答 6

2

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

  StringBuffer buf = new StringBuffer();
  buf.append(strURL1);
  buf.append(arg);
  URL url1 = new URL(buf.toString());
于 2012-04-27T10:24:45.403 回答
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();
    }
于 2012-04-27T10:25:22.903 回答
1

我没有通读RFC,但上下文(如 Java Doc for URL中提到的)可能是 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"

“解决方法”显然是自己连接部分,使用+.

于 2012-04-27T10:29:18.617 回答
1

你在这里使用 URL 的构造函数,它的参数为URL(URL context, String spec). 因此,您不要使用 URL 而是使用字符串传递 php 页面。context 需要是目录。正确的方法是

  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();
 }
于 2012-04-27T10:30:17.030 回答
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();
        }
于 2012-04-27T10:31:50.863 回答
0

当您阅读 java 文档时,它提到了指定 URL 的上下文,
即域和路径:

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

Where"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();
    }
于 2012-04-27T10:38:28.720 回答