当我调用connect()时,Java HttpURLConnection无法连接

时间:2010-01-28 00:07:39

标签: java url connection http-status-code-302 httpurlconnection

我正在尝试编写一个程序来对我的webapp进行自动化测试。为此,我使用HttpURLConnection打开连接。

我正在尝试测试的其中一个页面执行302重定向。我的测试代码如下所示:

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
connection.connect();
system.out.println(connection.getURL().toString());

因此,我们假设urlToSend为http://www.foo.com/bar.jsp,并且此页面会将您重定向到http://www.foo.com/quux.jsp。我的println语句应打印出http://www.foo.com/quux.jsp,对吗?

错误的。

重定向永远不会发生,它会打印出原始网址。但是,如果我通过调用connection.getResponseCode()更改切换出connection.connect()行,它就会神奇地起作用。

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
//connection.connect();
connection.getResponseCode();
system.out.println(connection.getURL().toString());

为什么我会看到这种行为?我做错了吗?

感谢您的帮助。

5 个答案:

答案 0 :(得分:17)

connect()方法只是创建一个连接。您必须提交请求(通过调用getInputStream()getResponseCode()getResponseMessage())以便返回和处理回复。

答案 1 :(得分:1)

connect()方法在URLConnection类中实现,不会被HttpURLConnection类覆盖。

URLConnection类不知道HTTP,因此即使它正在创建真实连接,也不应该遵循HTTP重定向。

如果您想要HTTP协议固有的行为,您可能希望坚持使用HttpURLConnection类中实现的方法,因为getResponseCode()方法是。

答案 2 :(得分:1)

在onCreate中添加以下内容

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

答案 3 :(得分:0)

为什么不使用apache中的HttpClient

答案 4 :(得分:0)

尝试setFollowRedirects,因为它可能有所帮助。实际上,首先尝试getFollowRedirects以查看它是否是问题(不太可能,因为默认情况下它是真的)。

修改:如果这不是您的问题,我会尝试从连接中读取内容(与getResponseCode一样,但我也会尝试getHeaderField查看是否阅读任何内容都会导致重定向被尊重。