2016-12-15 50 views
1

我使用HttpURLConnection來驗證來自數據庫的URL。有時候,在某些網址我會得到一個異常,我認爲他們超時但實際上可以達到(沒有400範圍錯誤)。正在尋找一種替代方法來驗證Java中的URL

增加超時似乎並不重要,我仍然得到一個異常。在捕獲區域中是否有第二次檢查來驗證URL是否有誤?相關代碼如下。它適用於99.9%的網址,即.01%。

try { 
    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
    connection.setConnectTimeout(timeout); 
    connection.setReadTimeout(timeout); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("User-Agent", 
      "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13"); 
    connection.connect() ; 
    int responseCode = connection.getResponseCode(); 
    if (responseCode >= 401) 
    { 
     String prcMessage = "ERROR: URL " + url + " not found, response code was " + responseCode + "\r"; 
     System.out.println(prcMessage); 
     VerifyUrl.writeToFile(prcMessage); 
     return (false); 
    } 
} 
catch (IOException exception) 
{ 
    String errorMessage = ("ERROR: URL " + url + " did not load in the given time of " + timeout + " milliseconds."); 
    System.out.println(errorMessage); 
    VerifyUrl.writeToFile(errorMessage); 
    return false; 
} 
+0

你可以使用正則表達式。 https://docs.oracle.com/javase/tutorial/essential/regex/ – aleb2000

+0

你可以使用Apache公共UrlValidator。 https://commons.apache.org/proper/commons-validator/apidocs/org/apache/commons/validator/routines/UrlValidator.html – ntalbs

回答

2

取決於您要檢查的內容。但我想Validating URL in Java讓你覆蓋。

你有兩個possiblities:

  1. 檢查語法(「這是網址與真實網址或只是做了?」)

    有介紹如何做大量的文字。基本上搜索RFC 3986.我想有人已經實施了這樣的檢查。

  2. 檢查語義(「可在網址是什麼?」)

    是不是真的這樣做雖然有可用於發送Java中的http請求不同的工具,一個更快的方法。您可以發送HEAD請求而不是GET,因爲HEAD省略了HTTP正文,並且可能導致請求更快,超時更少。

+0

異常看起來是由一個URL導致「太多重定向」造成的。我將setInstanceFollowRedirects和setFollowRedirects設置爲true,並且仍然導致異常。不知道如何解決它。 – Sulteric

+0

也可能是執行錯誤重定向的服務器故障。通常有一個可以跟隨的位置標題。我不知道你是如何做重定向的。最簡單的選擇是扔掉/關閉舊的連接,並按照新的位置。 – getjackx