2016-12-15 84 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

相关问题