这是我正在尝试做的事情的描述:我想通过 HttpURLConnection 向网站发送登录表单。所以首先我向登录页面发送一个 GET 请求,以检查它是否存在以及我尚未登录。在关闭连接和输入流之后,我将参数设置为发送。然后我发出一个 POST 请求以实际登录。
编码:
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 及更高版本的每个版本中工作?