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

9
我正在尝试编写一个程序来对我的Web应用进行自动化测试。为了实现这一目的,我使用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,对吗?
错误。
重定向从未发生,它打印出原始URL。 但是,如果我将connection.connect()行更改为调用connection.getResponseCode(),它就会神奇地工作。
URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
//connection.connect();
connection.getResponseCode();
system.out.println(connection.getURL().toString());

为什么我看到这种行为?我做错了什么吗?
谢谢帮助。
5个回答

20

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


谢谢,看起来是这样的! - sangfroid
2
谢谢您!一直在尝试理解为什么人们会调用getInputStream()等方法而从未调用connect()。您刚刚为我澄清了这一点。 - renatoaraujoc

2

connect() 方法是在 URLConnection 类中实现的,并且没有被 HttpURLConnection 类重写。

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

如果您想要与 HTTP 协议相关的行为,则可能希望坚持使用 HttpURLConnection 类中实现的方法,例如 getResponseCode() 方法。


0
在你的onCreate中添加以下内容。
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

0

尝试使用setFollowRedirects,因为它可能有帮助。实际上,首先尝试getFollowRedirects来查看是否存在问题(不太可能,因为默认情况下为true)。

编辑:如果这不是您的问题,我建议尝试从连接中读取一些内容(就像您使用getResponseCode一样),但我也会尝试getHeaderField来查看是否读取任何内容都会导致重定向被尊重。


已经尝试过了,getFollowRedirects返回true。此外,在另一个测试中,我遇到了一个单独的setFollowRedirects问题。基本上,setInstanceFollowRedirects()没有任何作用,而setFollowRedirects()则按预期工作。然而,我认为最好在另一篇帖子中询问这个问题,因为它是一个单独的问题。 - sangfroid
1
@sangfroid 我认为你会发现,你必须从连接中实际读取一些内容,才能使重定向被读取/尊重。 - Dan Rosenstark

-2

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