下面是我想要做的事情的描述: 我想通过HttpURLConnection发送登录表单到网站。 所以我首先发送一个GET请求到登录页面,检查它是否存在,并且我还没有登录。 当我关闭连接和输入流后,我正在参数发送。 然后我做一个POST请求实际登录Android 2.3.x和4.0.3中HttpURLConnection的差异
代码:
url = new URL("http://www.example.com/login/");
con = (HttpURLConnection) url.openConnection();
in = con.getInputStream();
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
loginData = getResponseData(in); // InputStream to String
in.close();
if(isBlank(loginData)){
return StatusCode.CONNECTION_FAILED; // no login page
}
if (Login.getLoginStatus(loginData)) {
return StatusCode.NO_ERROR; // already logged in
}
}
con.disconnect();
String params = "password="+URLEncoder.encode(login.second,"UTF-8")+
"&username="+URLEncoder.encode(login.first,"UTF-8");
url = new URL("http://www.example.com/login/login.php");
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setFixedLengthStreamingMode(params.getBytes().length);
out = con.getOutputStream();
out.write(params.getBytes());
out.close();
in = con.getInputStream(); \\ THIS IS WHERE IT GETS STUCK
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
loginData = getResponseData(in);
in.close();
if(isBlank(loginData)){
return StatusCode.CONNECTION_FAILED; // no login page
}
if (Login.getLoginStatus(loginData)) {
return StatusCode.NO_ERROR; // logged in
}
if (loginData.contains("Invalid username and//or password.")) {
return StatusCode.WRONG_LOGIN_DATA; // wrong login
}
}
con.disconnect();
在版本2.3.x版本返回响应代码:302,在没有InputStream中的数据(con.getInputStream()
很快速),我可以在eclipse调试模式下看到所有的头文件。
在版本4.0.3它返回响应代码:200,在所有的InputStream的数据(con.getInputStream()
被卡住约2分钟),并在调试模式下我可以阅读以下:
con.ResponseCode = -1
con.ResponseMessage = null
con.redirectionCount = 1
您是否知道为什么会出现差异,以及我如何才能在2.3.x及以上版本的每个版本中都能正常工作?
谢谢你的回答!但为什么当它遵循重定向时,获取InputStream需要很长时间? – user1557330 2012-07-28 20:19:03
顺便说一句,我尝试了两种方法,使用和不使用重定向(我手动进行重定向),并且使用更快的W/O(4秒到2分钟)。 – user1557330 2012-07-28 21:08:44
查看您的WEBSERVER日志。你可能在某种重定向循环中... – 2012-07-28 23:40:45