我正在尝试编写一个程序来对我的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());
为什么我会看到这种行为?我做错了吗?
感谢您的帮助。
答案 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
查看是否阅读任何内容都会导致重定向被尊重。