Partage
  • Partager sur Facebook
  • Partager sur Twitter

Librairie HttpClient

Classe introuvable + erreurs

Sujet résolu
    6 février 2010 à 0:27:18


    Bonsoir à tous !

    J'aimerais remplir un formulaire d'une page web avec Java. Pour cela, je me suis tourné vers la librairie de Jakarta Commons : HttpClient. (http://hc.apache.org/httpclient-3.x/)

    Je me suis ensuite basé sur ce tutoriel :

    http://dev.frandroid.com/wiki/Requête_HTTP_POST

    J'ai téléchargé la librairie version 4.0.1. J'importe les 2 jars dans mon projet Eclipse et, bizarre, mais il n'y a pas les classes NameValuePair et BasicNameValuePair ! (Donc,évidemment, les imports sont déjà un problème)

    Ensuite, Eclipse m'indique aussi une erreur sur la dernière ligne.

    Mon code est celui présenté par le tuto :

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.client.NameValuePair;
    import org.apache.http.message.BasicNameValuePair;
    
    public class Main {
    
    	public static void main(String[] args)
    	{
    		HttpPost httppost = new HttpPost("http://www.monsite.fr/monscript.php");
    		
    		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    		
    		nameValuePairs.add(new BasicNameValuePair("nom", "Moons"));
    
    		nameValuePairs.add(new BasicNameValuePair("age", "21"));
    		
    		httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    		
    		HttpClient httpclient = new DefaultHttpClient();
    
    		httpclient.execute(httppost); 
    	}
    }
    


    Ensuite, j'ai téléchargé la librairie 'Commons HttpClient' en version 3.1 et là j'ai pu y trouver une classe NameValuePair. Cependant, ce n'est pas une interface ! (Contrairement à ce qui est indiqué dans la doc (http://hc.apache.org/httpcomponents-core/httpcore/apidocs/org/apache/http/NameValuePair.html)).

    Donc, je l'ai utilisée à la manière d'un 'BasicNameValuePair'. Ensuite, il y a encore un problème au niveau du UrlEncodedFormEntity, du setEntity et de la méthode execute. D'ailleurs, dans l'API, la méthode execute n'existe pas mais c'est executeMethod. (Que j'ai donc utilisée)
    API : http://hc.apache.org/httpclient-3.x/ap [...] tpClient.html

    Voici mon code remanié qui ne compile toujours pas :
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.commons.httpclient.*;
    
    public class Main {
    
    	
    	public static void main(String[] args)
    	{
    		HttpPost httppost = new HttpPost("http://www.monsite.fr/monscript.php");
    		
    
    		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    		
    		nameValuePairs.add(new NameValuePair("nom","moons"));
    
    	    nameValuePairs.add(new NameValuePair("age","21"));
    	    
    	    UrlEncodedFormEntity tmp = new UrlEncodedFormEntity(nameValuePairs);
    		
    		httppost.setEntity(tmp);
    		
    		HttpClient httpclient = new DefaultHttpClient();
    
    		httpclient.executeMethod(httppost); 
    	}
    }
    


    Quelqu'un saurait m'aider ? :-)

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2010 à 13:26:52

      Comment ça importer ? Tu dois placer tes .jar dans ton build path.
      Clique droit sur le projet > Build Path > Add external jar. Ou les placer dans le dossier lib s'il y en a un.
      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2010 à 23:15:04

        C'est ce que j'ai fait.

        Il pourrait y avoir un conflit entre les 2 packages (version 4.0.1 et 3.1) ?

        C'est quand même anormal que les classes présentes dans les jar diffèrent de ce qui est présenté dans l'API ...
        • Partager sur Facebook
        • Partager sur Twitter
          7 février 2010 à 23:51:48

          Il peut très bien y avoir des conflits, j'ai déjà eu ce genre de problème avec le framwork hibernate
          • Partager sur Facebook
          • Partager sur Twitter
            8 février 2010 à 0:54:30

            Alors alors, tout d'abord, j'avais oublié d'inclure les dépendances (http://hc.apache.org/httpclient-3.x/dependencies.html).

            J'ai également supprimé du buildpath les fichiers de la version 4.0.1, ne laissant que la 3.1.

            J'ai trouvé une source qui fonctionne :

            http://www.java2s.com/Code/Java/Apache [...] odExample.htm

            Cependant, lorsque je teste sur un formulaire test, cela ne fonctionne pas :s (Il me renvoie le code de la page test.html)
            Et le code retourné par 'executeMethod' est 200, qui correspond à 'OK'.

            Voici mon code (qui est + - le même que celui trouvé sur le net)

            import org.apache.commons.httpclient.HttpClient;
            import org.apache.commons.httpclient.methods.PostMethod;
            
            import java.io.BufferedReader;
            import java.io.InputStreamReader;
            
            public class Test1 {
            
              public static void main(String args[]) {
            
            	    // On cree le client
            		HttpClient client = new HttpClient();
            		// On indique un nom d'User-Agent
            		client.getParams().setParameter("http.useragent", "Test Client");
            		
            		// Le HTTPMethod qui sera un Post en lui indiquant l'URL du formulaire
            		PostMethod method = new PostMethod("http://www.pexiweb.be/tmp/tmp/test.html");
            		// On ajoute les parametres du formulaire
            		method.addParameter("pseudo", "pyo"); // (champs, valeur)
            		
            		// Le buffer qui nous servira a recuperer le code de la page
            		BufferedReader br = null;
            		
            		try
            		{
            		  // http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpStatus.html
            		  int retour = client.executeMethod(method);
            
            		  System.out.println("La reponse de executeMethod est : " + retour);
            		  
            		  br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));
            		  String readLine;
            				
            		  // Tant que la ligne en cours n'est pas vide
            		  while(((readLine = br.readLine()) != null))
            		  {
            			   System.out.println(readLine);
            		  }
            		} 
            		catch (Exception e) 
            		{
            			System.err.println(e); // erreur possible de executeMethod
            		} 
            		finally 
            		{
            			// On ferme la connexion
            			method.releaseConnection();
            			
            			if(br != null) 
            			{
            				try 
            			    { 
            					br.close(); // on ferme le buffer 
            			    } 
            			    catch (Exception e) { /* on fait rien */ }
            			}
            		}
            
              }
            }
            


            Et lorsque je teste avec les données du code source trouvé, ça fonctionne.

            Quelque chose qui pourrait être lié (mais je vois pas comment résoudre le problème) : lorsqu'on teste 'http://search.yahoo.com/search' dans son navigateur, on est redirigé vers 'http://search.yahoo.com/web?fr='. Et lorsqu'on teste cette dernière URL dans le programme, cela ne fonctionne plus.



            Edit (bien plus tard!) :

            L'erreur est toute bête, il ne faut pas rentrer l'adresse où se trouve le formulaire mais l'adresse de la page qui traite le formulaire !
            Un exemple de requête post est dispo sur mon blog :
            http://blog.pexiweb.be/remplir-un-form [...] t-httpclient/
            • Partager sur Facebook
            • Partager sur Twitter

            Librairie HttpClient

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown