当我调用connect()时,Java 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 ,对吗?

错误。

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

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

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

谢谢您的帮助。

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

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

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

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

在onCreate中添加以下内容

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

为什么不使用apache中的HttpClient 。

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

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