在Java中validationURL

我想知道是否有Java中的任何标准API来validation给定的URL? 我想检查如果URLstring是正确的,即给定的协议是有效的,然后检查是否可以build立连接。

我尝试使用HttpURLConnection,提供URL并连接到它。 我的需求的第一部分似乎是履行,但当我尝试执行HttpURLConnection.connect(),'java.net.ConnectException:连接被拒绝'exception被抛出。

这可能是因为代理设置? 我尝试设置代理系统属性,但没有成功。

让我知道我做错了什么。

为了社区的利益,因为这个线程是search谷歌的顶部
urlvalidation器java


捕捉exception是昂贵的,应尽可能避免。 如果您只想validation您的string是有效的URL,则可以使用Apache Commons Validator项目中的UrlValidator类。

例如:

 String[] schemes = {"http","https"}; // DEFAULT schemes = "http", "https", "ftp" UrlValidator urlValidator = new UrlValidator(schemes); if (urlValidator.isValid("ftp://foo.bar.com/")) { System.out.println("URL is valid"); } else { System.out.println("URL is invalid"); } 

您需要创build一个URL对象和一个URLConnection对象。 以下代码将testingURL的格式以及是否可以build立连接:

 try { URL url = new URL("http://www.yoursite.com/"); URLConnection conn = url.openConnection(); conn.connect(); } catch (MalformedURLException e) { // the URL is not in a valid form } catch (IOException e) { // the connection couldn't be established } 

java.net.URL类实际上并不是validationURL的好方法。 在构build过程中, MalformedURLException 不会抛出所有格式不正确的URL。 在java.net.URL#openConnection().connect()上捕获IOException java.net.URL#openConnection().connect()不validationURL,只告诉连接是否可以build立。

考虑这段代码:

  try { new URL("http://.com"); new URL("http://com."); new URL("http:// "); new URL("ftp://::::@example.com"); } catch (MalformedURLException malformedURLException) { malformedURLException.printStackTrace(); } 

..没有抛出任何例外。

我build议使用一些使用上下文无关语法实现的validationAPI,或者使用正则expression式进行非常简单的validation。 不过,我需要有人为此提出一个高级或标准的API,我最近才开始自己search。

注意有人build议将URL#toURI()与处理exceptionjava.net. URISyntaxException结合使用java.net. URISyntaxException java.net. URISyntaxException可以促进URL的validation。 但是,这种方法只能捕获上面非常简单的情况之一。

结论是没有标准的Java URLparsing器来validationURL。

使用标准API,将string传递给URL对象,然后将其转换为URI对象。 这将根据RFC2396标准准确确定URL的有效性。

例:

 public boolean isValidURL(String url) { URL u = null; try { u = new URL(url); } catch (MalformedURLException e) { return false; } try { u.toURI(); } catch (URISyntaxException e) { return false; } return true; } 

在android上使用android.webkit.URLUtil

 URLUtil.isValidUrl(URL_STRING); 

注意:这只是检查URL的初始scheme,而不是整个URL是有效的。

你确定你正在使用正确的代理作为系统属性?

另外,如果您使用1.5或1.6,则可以将java.net.Proxy实例传递给openConnection()方法。 这是更优雅的imo:

 //Proxy instance, proxy ip = 10.0.0.1 with port 8080 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080)); conn = new URL(urlString).openConnection(proxy); 

指出URL对象处理validation和连接是非常重要的。 然后,只有在sun.net.www.protocol中提供处理程序的协议才是有效的( fileftpgopherhttphttpsjarmailtonetdoc )。 例如,尝试使用ldap协议创build一个新的URL:

 new URL("ldap://myhost:389") 

你将得到一个java.net.MalformedURLException: unknown protocol: ldap

你需要实现自己的处理程序,并通过URL.setURLStreamHandlerFactory()注册它。 如果你只是想validationURL语法,那就太矫枉过正了,正则expression式似乎是一个更简单的解决scheme。

有一种方法可以严格按照Java中的标准进行URLvalidation,而无需借助第三方库:

 boolean isValidURL(String url) { try { new URI(url).parseServerAuthority(); return true; } catch (URISyntaxException e) { return false; } } 

URI的构造函数检查url是否是有效的URI,对parseServerAuthority的调用确保它是一个URL(绝对或相对)而不是URN。

谢谢。 按照NickDK的build议通过代理服务器打开URL连接就可以正常工作。

 //Proxy instance, proxy ip = 10.0.0.1 with port 8080 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080)); conn = new URL(urlString).openConnection(proxy); 

但是系统属性并不像前面提到的那样工作。

再次感谢。

问候,科亚