在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中提供处理程序的协议才是有效的( file , ftp , gopher , http , https , jar , mailto , netdoc )。 例如,尝试使用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);
但是系统属性并不像前面提到的那样工作。
再次感谢。
问候,科亚