如何编程测试HTTP连接?

22

使用Java,我如何测试URL是否可访问并返回有效的响应?

http://stackoverflow.com/about
4个回答

47

作为一个单元测试的解决方案:

public void testURL() throws Exception {
    String strUrl = "http://stackoverflow.com/about";

    try {
        URL url = new URL(strUrl);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        urlConn.connect();

        assertEquals(HttpURLConnection.HTTP_OK, urlConn.getResponseCode());
    } catch (IOException e) {
        System.err.println("Error creating HTTP connection");
        e.printStackTrace();
        throw e;
    }
}

@David:不,经常有人问他们已经知道答案的问题,只是为了为 SO 提供更有用的内容。 - C. K. Young
很好,如果那样的话,请原谅我的评论。然后感谢分享解决方案... - David Santamaria
@brass-kazoo 我遇到了连接被拒绝的异常 :( - Xitrum
1
难道在 finally 块中也不需要调用 urlCon.disconnect() 吗?或者也需要完全消耗 InputStream 吗? - Enwired
5
如果你在局域网内使用该方法,但是计算机上并未运行Web服务器,那么该方法会挂起。你需要在HttpURLConnection中使用setConnectTimeout和/或setReadTimeout。 - Tim Autin

7

从我记得的Java 5开始,InetAddress类包含一个名为isReachable()的方法; 因此,您可以在Java中使用它来实现ping。您还可以为此方法指定超时时间。这只是上面发布的单元测试方法的另一种选择,可能更有效。


3
isReachable仅测试您是否可以访问该网站,而不是该网站实际运行(例如,返回200而不是500或类似的状态)。 - C. K. Young
1
此外,单元测试的要求更多地是彻底而非高效。:-P - C. K. Young

0
System.out.println(new InetSocketAddress("http://stackoverflow.com/about", 80).isUnresolved());

如果页面可达,即为前提条件,则返回false

为了完全覆盖初始问题,您需要实现一个http getpost


-12
import org.apache.commons.validator.UrlValidator;

public class ValidateUrlExample {

    public static void main(String[] args) {

        UrlValidator urlValidator = new UrlValidator();

        //valid URL
        if (urlValidator.isValid("http://www.mkyong.com")) {
            System.out.println("url is valid");
        } else {
            System.out.println("url is invalid");
        }

        //invalid URL
        if (urlValidator.isValid("http://invalidURL^$&%$&^")) {
            System.out.println("url is valid");
        } else {
            System.out.println("url is invalid");
        }
    }
}

输出:

网址有效
网址无效

来源:http://www.mkyong.com/java/how-to-validate-url-in-java/


5
这完全没有回答问题:你发布的代码只检查URL是否有效,而不是检查该URL下的主机是否可达或返回给定的响应。 - Daniel Kamil Kozar
2
这是一个误导性的答案,为此打-1分。 - Katianie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接