8

我正在尝试编写一个程序来对我的 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());

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

谢谢您的帮助。

4

5 回答 5

19

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

于 2010-01-28T00:17:55.237 回答
1

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

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

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

于 2010-01-28T00:21:16.747 回答
0

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

编辑:如果这不是你的问题,我会尝试从连接中读取一些东西(就像你做的那样,getResponseCode但我也会尝试getHeaderField看看读取任何东西是否会导致重定向受到尊重)。

于 2010-01-28T00:13:46.030 回答
0

在您的 onCreate 中添加以下内容

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
于 2015-04-29T11:48:39.627 回答
-1

你为什么不使用来自 apache 的HttpClient 。

于 2010-01-28T00:10:54.460 回答