2012-07-27 94 views
2

下面是我想要做的事情的描述: 我想通过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及以上版本的每个版本中都能正常工作?

回答

3

在4.0.3中,自动为您处理重定向(这就是为什么您甚至没有看到302响应代码)。

getInstanceFollowRedirects方法(或getFollowRedirects静态方法)HttpURLConnection类可以用来查看是否自动跟踪重定向。与他们对应的设置器对应设备(setInstanceFollowRedirects或静态setFollowRedirects)可以更改此行为。

+0

谢谢你的回答!但为什么当它遵循重定向时,获取InputStream需要很长时间? – user1557330 2012-07-28 20:19:03

+0

顺便说一句,我尝试了两种方法,使用和不使用重定向(我手动进行重定向),并且使用更快的W/O(4秒到2分钟)。 – user1557330 2012-07-28 21:08:44

+0

查看您的WEBSERVER日志。你可能在某种重定向循环中... – 2012-07-28 23:40:45