IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Envoyer requête HTTP avec données POST


Sujet :

Services Web Java

  1. #1
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut Envoyer requête HTTP avec données POST
    Bonjour,
    j'ai trouvé sur le net un exemple de code pour demander une page internet, et ce via une requête HTTP en utilisant java.nio
    Voici donc la méthode que j'ai faite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public static String fileGetContents(String url, String host, int port) throws IOException {
    	 String result = "";
     
        SocketAddress remote = new InetSocketAddress(host, port);
        SocketChannel channel = SocketChannel.open(remote);
     
        String request = "GET /"+url+" HTTP/1.1\r\nUser-Agent: HTTPGrab\r\nAccept: text/*\r\nConnection: close\r\nHost: " +host + "\r\n" + "\r\n";
      //  System.out.println(request);
     
        ByteBuffer header = ByteBuffer.wrap(request.getBytes("US-ASCII"));
        channel.write(header);
     
        ByteBuffer buffer = ByteBuffer.allocate(8192);
        while (channel.read(buffer) != -1) {
          buffer.flip();
          result+=decoder.decode(buffer).toString();
          buffer.clear();
        }
        channel.close();
        return result;
      }
    Cela marche très bien et j'ai constater une amélioration notable de la vitesse. Seulement j'aimerais bien pouvoir envoyé des données POST, et comme je ne connaissais pas les requête HTTP j'ai été me renseigné, et j'ai fini par adopter ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public static String fileGetContents(String url, String host, int port, String post) throws IOException {
    		String result = "";
     
    		SocketAddress remote = new InetSocketAddress(host, port);
    		SocketChannel channel = SocketChannel.open(remote);
     
    		String request = "POST /"+url+" HTTP/1.1\r\nUser-Agent: HTTPGrab\r\nAccept: text/html\r\nConnection: close\r\nHost: " +host + "\r\n\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: "+post.length()+"\r\n"+post+"\r\n";
    		System.out.println(request);
    		System.out.println("-------------------------");
     
    		ByteBuffer header = ByteBuffer.wrap(request.getBytes("US-ASCII"));
    		channel.write(header);
     
    		ByteBuffer buffer = ByteBuffer.allocate(8192);
    		while (channel.read(buffer) != -1) {
    			buffer.flip();
    			result+=decoder.decode(buffer).toString();
    			buffer.clear();
    		}
    		channel.close();
    		return result;
    	}
    j'ai ensuite créer une page internet pour faire mes test :
    c'est cette page, qui répond 'datapost no exists ...' si on ne lui passe rien, ou 'datapost finded -> valeur_d_essai' quand on lui passe une valeur par post avec le nm de variable 'essai'. Vous pouvez tester le fonctionement de cette page grâce à cette autre page.

    Bon, maintenant le code d'essai :
    (la fonction que j'ai montrée plus haut est dans la class Framework).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public static void main(String[] args){
    		try {
    			String result = Framework.fileGetContents("/essai.php", "www.pedagogiefondamentale.fr", 80, "essai=valeur")	;
    			System.out.println(result);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}	
    	}
    et le résultat (très décevant) :
    (en rouge l'affichage de la requête envoyée e en bleu le résultat renvoyé les tirets c'est juste pour marquer la limite entre le deux.)

    POST /essai.php HTTP/1.1
    User-Agent: HTTPGrab
    Accept: text/html
    Connection: close
    Host: www.pedagogiefondamentale.fr

    Content-Type: application/x-www-form-urlencoded
    Content-Length: 12
    essai=valeur



    -------------------------
    HTTP/1.1 200 OK
    Set-Cookie: mediaplan=R3721204049; path=/; expires=Wed, 21-Dec-2011 21:55:32 GMT
    Date: Mon, 19 Dec 2011 09:43:46 GMT
    Server: Apache/2.2.X (OVH)
    X-Powered-By: PHP/5.2.17
    Vary: Accept-Encoding
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html

    16
    datapost no exists ...
    0


    le requête envoyée me paraît pourtant juste ... (j'ai analysé les requête qu'envoi Firefox, et c'est sensiblement pareil).

    Je suppose qu'il y a une erreur dans m'a manière d'envoyé les requête ...

    Merci d'avance.
    (et merci de m'avoir lu jusqu'au bout )

  2. #2
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    j'ai fini par trouver la solution grâce à la FAQ java :
    voilà un méthode qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public static String fileGetContents(String src_url, HashMap<String, String> donnees){
            OutputStreamWriter writer = null;
               BufferedReader reader = null;
               try {
                 //encodage des paramètres de la requête
                   String data ="";
                   for(Entry<String, String> e:donnees.entrySet()){
                       data += URLEncoder.encode("essai", "UTF-8")+"="+URLEncoder.encode("valeur_d_essai", "UTF-8")+"&";
                   }
                   if(data.length()>0){
                       data = data.substring(0, data.length()-1);
                   }
                   System.out.println(data);
     
                  //création de la connection
                  URL url = new URL(src_url);
                  URLConnection conn = url.openConnection();
                  conn.setDoOutput(true);
     
                  //envoi de la requête
                  writer = new OutputStreamWriter(conn.getOutputStream());
                  writer.write(data);
                  writer.flush();
     
                  //lecture de la réponse
                  reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                 String result = "";
                 String line;
                  while ((line = reader.readLine()) != null) {
                     result+=line+"\n";
                  }
                  return result;
               }catch (Exception e) {
                  e.printStackTrace();
                  return null;
               }finally{
                  try{writer.close();}catch(Exception e){}
                  try{reader.close();}catch(Exception e){}
               }
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête HTTP avec caméra IP
    Par Sleeping Lionheart dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 28/02/2009, 22h25
  2. Envoyer requête HTTP
    Par Arnaud F. dans le forum Développement Web en Java
    Réponses: 9
    Dernier message: 08/01/2009, 21h45
  3. Requête HTTP, GET et POST
    Par sebxid dans le forum Débuter
    Réponses: 1
    Dernier message: 05/09/2008, 16h19
  4. Faire une requête https avec une application Delphi 7
    Par davidkungfu dans le forum Web & réseau
    Réponses: 12
    Dernier message: 10/04/2008, 11h39
  5. Redirection php avec données POST et fsockopen
    Par Cylie34 dans le forum Langage
    Réponses: 1
    Dernier message: 26/02/2007, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo