2010-01-28 26 views
7

我试图编写一个程序在我的webapp上执行自动测试。为了做到这一点,我使用HttpURLConnection打开了一个连接。当我调用connect时,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()); 

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

感谢您的帮助。

回答

16

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

+0

谢谢,这似乎确实如此! – sangfroid 2010-01-28 00:33:52

+1

谢谢你!一直试图理解为什么人们发出getInputStream()等没有调用connect()。你刚刚向我澄清。 – Renatinn 2015-09-06 20:38:34

0

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

编辑:如果这不是你的问题,我会尝试从连接读的东西(如你getResponseCode做,但我也想尝试getHeaderField,看是否读取所有东西导致重定向到被尊重)。

+0

已经尝试过,getFollowRedirects返回true。另外,我在单独的测试中遇到了单独的setFollowRedirects问题。基本上,setInstanceFollowRedirects()不做任何事情,而setFollowRedirects()做它应该做的。不过,我认为在单独的帖子中询问这个问题会更好,因为这是一个单独的问题。 – sangfroid 2010-01-28 00:20:23

+1

@sangfroid我认为你会发现你必须从连接中实际读取一些信息,才能阅读/遵守重定向。 – 2010-01-28 00:21:59

1

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

URLConnection类不知道HTTP,所以即使创建了真正的连接,也不应该遵循HTTP重定向。

如果你想要的行为内在的HTTP协议,你可能想坚持在HttpURLConnection的类实现的方法,作为getResponseCode()方法。

0

添加以下你的onCreate

StrictMode.ThreadPolicy policy = new StrictMode. 
ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
相关问题