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
Vous devez vous connecter pour publier un commentaire.
J'ai maintenant abandonné sur le
HttpClient
route pour donner la réponse attendue à partir du serveur lors de l'exécution sur Android. Au lieu de cela j'ai réécrit ledoPost
méthode ci-dessus pour utiliser unHttpsURLConnection
à la place. Voici la nouvelle (de travail) de la version dans l'espoir qu'il sera utile à quelqu'un.Je n'ai toujours aucune idée pourquoi le
HttpClient
façon de ne pas fonctionner correctement.OriginalL'auteur dave.c
pour éviter les collisions à utiliser ce pot pour httpclient
httplib
et ce post serait aussi très utile
un débordement de pile post
OriginalL'auteur sunil shetty
Est-il possible que ce site ne user-agent de détection et renvoie en fait à des résultats différents, car c'est Android? Étant donné que 200 implique succès, pourquoi faut-il donner un 302 au lieu de 200? Avez-vous l'impression du résultat que vous obtenez quand il revient a 200, et qu'il ne donne aucune information supplémentaire?
OriginalL'auteur Michael Aaron Safyan
Vérifier la RedirectHandler, remplacer la valeur par défaut de l'un et de faire des coupes, j'ai eu des problèmes avec ce que lorsque vous allez pour Android...
Hum, ça pourrait être un agent utilisateur problème?
L'agent de l'utilisateur est défini dans le code ci-dessus, et est réglé à la même valeur si elle est exécutée à l'intérieur d'Android ou Java pur. J'ai essayé un android user agent, un FF/windows, et certaines personnalisés. Ils donnent tous le même comportement.
OriginalL'auteur dacwe