HttpPost travaille dans le projet Java, pas dans Android

J'ai écrit un code pour mon appareil Android pour vous connecter à un site web sur https et d'analyser des données, les pages qui en résulte. Un HttpGet arrive d'abord à obtenir des informations nécessaires pour la connexion, puis une HttpPost pour faire le processus de connexion.

Le code ci-dessous fonctionne très bien dans un projet Java dans Eclipse qui a les fichiers Jar suivants dans le build path: 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());
}
}

Le serveur (qui n'est pas sous mon contrôle) renvoie une redirection 302 lors de la connexion a réussi, et 200 si il échoue et re-charges la page de connexion. Lors de l'exécution avec le ci-dessus les fichiers Jar-je obtenir la redirection 302, cependant si j'ai exécuter exactement le même code à partir d'un projet Android avec le 1.6 d'Android fichier Jar dans le build path-je obtenir les 200 de réponse du serveur. Je reçois la même réponse de 200 lors de l'exécution du code sur ma 2.2 appareil.

Mon application android a internet autorisations, et le HttpGet fonctionne très bien. Je suis en supposant que le problème réside dans le fait que HttpPost (ou autres) est différent d'une certaine manière significative entre les Android Jar version et les nouvelles versions d'Apache.

J'ai essayé d'ajouter le Apache bibliothèques pour le build path du projet Android, mais en raison de la double cours, je reçois des messages comme: INFO/dalvikvm(390): DexOpt: not resolving ambiguous class 'Lorg/apache/http/impl/client/DefaultHttpClient;' dans le journal. J'ai aussi essayé d'utiliser un MultipartEntity au lieu de la UrlEncodedFormEntity mais j'obtiens le même résultat 200.

Donc, j'ai quelques questions:

- Puis-je forcer le code s'exécutant sous android d'utiliser la plus récente Apache bibliothèques de préférence pour les versions d'Android?

- Si non, quelqu'un a une idée comment puis-je modifier mon code pour qu'il fonctionne avec Android Jar?

- Existe-il d'autres, des approches totalement différentes de faire un HttpPost dans Android?

- D'autres idées?

J'ai lire un beaucoup de postes et code mais je ne suis pas aller nulle part. Je suis coincé sur ce pour un couple de jours et j'en suis à une perte de la façon d'obtenir la chose à travailler, donc je vais essayer quoi que ce soit à ce point. Merci à l'avance.

OriginalL'auteur dave.c | 2010-11-19