2012-04-27 28 views
2

我使用以下代碼合併兩個URL。在JAVA中合併兩個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

臨屋的javadoc關於構造URL(網址背景下,字符串規範)解釋它應該尊重RFC。

我做錯了什麼?

感謝

UPDATE:

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" 
    ... 

回答

2

你總是可以先合併字符串,然後創建基於合併的字符串的URL。

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

它更復雜,因爲代碼應該能夠處理所有其他情況下,已經爲我添加URL所梅索德處理我的問題 – benfromaix 2012-04-27 14:15:12

+0

在這種情況下,我認爲@Anurag Ramdasan/aioobe答案更適合你。基本上URLContext將刪除「file.php」。但只要你能夠減去這個值並將其用作URL參數,你就可以走了。 – Rudy 2012-04-30 07:20:22

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(); 
    } 
+0

它更復雜,因爲代碼應該能夠處理URL方法已處理的所有其他案例,正如我在我的問題 – benfromaix 2012-04-27 14:28:49

+0

中添加的,但代碼應該能夠處理所有其他已由URL方法處理的案例,正如我在我的題。 – benfromaix 2012-04-27 14:51:46

1

我還沒有讀完the RFC,但背景(如Java文檔提到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" 

「變通辦法」 顯然是對自己的拼接部分,採用+

1

您正在使用URL的構造函數,其參數爲URL(URL context, String spec)。所以你不要通過網址傳遞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(); 
} 
+0

好吧,但是當我得到一個頁面的html源代碼時,我必須處理所有的情況。我有提供源代碼的頁面的URL,以及指向外部頁面的所有情況下的鏈接(相對鏈接,絕對鏈接,查詢...)是否有這樣的功能? – benfromaix 2012-04-27 10:33:05

+0

如果要從URL中檢索源,最簡單的方法是使用HttpURLConnection類。它將響應作爲頁面的來源發送。 – 2012-04-27 10:40:26

+0

我的問題與路徑和它的上下文之間的url解析有關。 – benfromaix 2012-04-27 14:51:17

0

當你讀它提到有關指定URL
哪個域和路徑的背景下,Java文檔試試這個

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(); 
     } 
0

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

其中"file.php"被認爲是屬於上述上下文的文本。
這兩個參數重載構造函數使用URL的上下文作爲基礎,並添加第二個參數來創建一個完整的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(); 
    } 
+0

它更復雜,因爲代碼應該能夠處理URL方法已處理的所有其他案例,正如我在我的問題中添加的那樣 – benfromaix 2012-04-27 14:29:58

+0

然後製作一個方法,將URL(url,textURL)等所需的兩個URL組合起來;你的目標將會實現! – GingerHead 2012-04-27 16:04:38