我已经为我的Android设备编写了一些代码,以通过HTTPS登录到网站并解析出一些数据。 首先进行
下面的代码在Eclipse中的Java项目中运行良好,该项目具有以下构建路径上的JAR文件:
当登录成功时,服务器(不在我的控制之下)返回302重定向,如果登录失败并重新加载登录页面,则返回200。使用上述JAR文件运行时,我得到了302重定向,但是如果我从Android项目中使用相同的代码并将1.6 Android JAR文件添加到构建路径中,我会从服务器得到200响应。在我的2.2设备上运行代码时,我也会得到相同的200响应。
我的Android应用程序具有Internet权限,并且HttpGet运作正常。我认为问题在于HttpPost(或其他类)在Android JAR版本和较新的Apache版本之间存在某些显着差异。
我已尝试将Apache库添加到Android项目的构建路径中,但由于重复的类,我收到像“INFO/dalvikvm(390): DexOpt: not resolving ambiguous class 'Lorg/apache/http/impl/client/DefaultHttpClient;'”这样的消息日志。我还尝试使用MultipartEntity而不是UrlEncodedFormEntity,但我得到了相同的200结果。
因此,我有几个问题:
HttpGet
以获取登录所需的一些信息,然后进行HttpPost
以进行实际的登录过程。下面的代码在Eclipse中的Java项目中运行良好,该项目具有以下构建路径上的JAR文件:
httpcore-4.1-beta2.jar
,httpclient-4.1-alpha2.jar
,httpmime-4.1-alpha2.jar
和commons-logging-1.1.1.jar
。public static MyBean gatherData(String username, String password) {
MyBean myBean = new MyBean();
try {
HttpResponse response = doHttpGet(URL_PAGE_LOGIN, null, null);
System.out.println("Got login page");
String content = EntityUtils.toString(response.getEntity());
String token = ContentParser.getToken(content);
String cookie = getCookie(response);
System.out.println("Performing login");
System.out.println("token = "+token +" || cookie = "+cookie);
response = doLoginPost(username,password,cookie, token);
int respCode = response.getStatusLine().getStatusCode();
if (respCode != 302) {
System.out.println("ERROR: not a 302 redirect!: code is \""+ respCode+"\"");
if (respCode == 200) {
System.out.println(getHeaders(response));
System.out.println(EntityUtils.toString(response.getEntity()).substring(0, 500));
}
} else {
System.out.println("Logged in OK, loading account home");
// redirect handler and rest of parse removed
}
}catch (Exception e) {
System.out.println("ERROR in gatherdata: "+e.toString());
e.printStackTrace();
}
return myBean;
}
private static HttpResponse doHttpGet(String url, String cookie, String referrer) {
try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
client.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
HttpGet httpGet = new HttpGet(url);
httpGet.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
httpGet.setHeader(HEADER_USER_AGENT,HEADER_USER_AGENT_VALUE);
if (referrer != null && !referrer.equals("")) httpGet.setHeader(HEADER_REFERER,referrer);
if (cookie != null && !cookie.equals("")) httpGet.setHeader(HEADER_COOKIE,cookie);
return client.execute(httpGet);
} catch (Exception e) {
e.printStackTrace();
throw new ConnectException("Failed to read content from response");
}
}
private static HttpResponse doLoginPost(String username, String password, String cookie, String token) throws ClientProtocolException, IOException {
try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
client.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
HttpPost post = new HttpPost(URL_LOGIN_SUBMIT);
post.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
post.setHeader(HEADER_USER_AGENT,HEADER_USER_AGENT_VALUE);
post.setHeader(HEADER_REFERER, URL_PAGE_LOGIN);
post.setHeader(HEADER_COOKIE, cookie);
post.setHeader("Content-Type","application/x-www-form-urlencoded");
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair("org.apache.struts.taglib.html.TOKEN", token));
formParams.add(new BasicNameValuePair("showLogin", "true"));
formParams.add(new BasicNameValuePair("upgrade", ""));
formParams.add(new BasicNameValuePair("username", username));
formParams.add(new BasicNameValuePair("password", password));
formParams.add(new BasicNameValuePair("submit", "Secure+Log+in"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams,HTTP.UTF_8);
post.setEntity(entity);
return client.execute(post);
} catch (Exception e) {
e.printStackTrace();
throw new ConnectException("ERROR in doLoginPost(): "+e.getMessage());
}
}
当登录成功时,服务器(不在我的控制之下)返回302重定向,如果登录失败并重新加载登录页面,则返回200。使用上述JAR文件运行时,我得到了302重定向,但是如果我从Android项目中使用相同的代码并将1.6 Android JAR文件添加到构建路径中,我会从服务器得到200响应。在我的2.2设备上运行代码时,我也会得到相同的200响应。
我的Android应用程序具有Internet权限,并且HttpGet运作正常。我认为问题在于HttpPost(或其他类)在Android JAR版本和较新的Apache版本之间存在某些显着差异。
我已尝试将Apache库添加到Android项目的构建路径中,但由于重复的类,我收到像“INFO/dalvikvm(390): DexOpt: not resolving ambiguous class 'Lorg/apache/http/impl/client/DefaultHttpClient;'”这样的消息日志。我还尝试使用MultipartEntity而不是UrlEncodedFormEntity,但我得到了相同的200结果。
因此,我有几个问题:
- 我能强制在Android下运行的代码使用新版的Apache库而不是Android版本吗?
- 如果不能,有没有什么办法可以修改我的代码,让它能够与Android JAR文件一起工作?
- 在Android中进行HttpPost的其他完全不同的方法还有吗?
- 还有其他的想法吗?
我已经阅读了很多帖子和代码,但我并没有取得任何进展。