# JAVA: "Interroger" une page Web via formulaire



## Bazinga (22 Septembre 2009)

Bonjour à tous,
Pour ma première appli Java, j'aimerais interroger une page web qui contient des formulaires à remplir ( exemple: itinéraires de train-avion, etc...) et afficher les résultats dans mon appli.
Je pense que c'est un bon but simple, mais j'ai besoin de quelques lignes ou d'applis similaire à décortiquer pour me faire une idée.
Possédez vous des snippet ou un tuto, voire un appli similaire qui me permettrait de me faire une idée de la marche à suivre?
C'est une technique un peu particulière qui diffère de tous les tutos que je trouve.
Je vous remercie d'avance pour tous les renseignements que vous pourriez m'apporter.!


Je pense pour résumer que j'ai besoin de 3 infos claires et pas trop difficiles (je l'espère.. lol)
1) comment se connecter à une page web et remplir des champs d'un formulaire?
2) comment "appuyer" sur le bouton OK?
3) comment remettre en page les résultats recus?


----------



## iota (22 Septembre 2009)

Salut.



profete162 a dit:


> Je pense pour résumer que j'ai besoin de 3 infos claires et pas trop difficiles (je l'espère.. lol)
> 1) comment se connecter à une page web et remplir des champs d'un formulaire?


Connais tu un peu le protocole HTTP et le HTML ?
Quelle méthode (GET out POST) dois tu utiliser pour invoquer l'action de ton formulaire ?
Tu risques également d'avoir des problèmes si il est nécessaire que tu sois authentifier sur le site pour accéder au formulaire.



profete162 a dit:


> 2) comment "appuyer" sur le bouton OK?


Tu n'a pas à valider le formulaire. Tu fais directement appel à l'action du formulaire (en renseignant dans ta requête les valeurs des champs).



profete162 a dit:


> 3) comment remettre en page les résultats recus?


C'est bien là le problème. Tu vas devoir passer le résultat HTML "à la main".
Et donc, si tu n'es pas maitre du site auquel tu fais appel, ton application pourrait ne plus fonctionner en cas de modification de celui-ci.

Quelques exemples de code trouver rapidement avec Google ici et là.

Enfin, globalement, ce n'est pas vraiment une bonne idée 
Une solution (si cela est possible) pourrait être de mettre en place un webservice (SOAP/HTTP en général)  qui s'occupera de faire les traitements nécessaires.

@+
iota


----------



## molgow (26 Septembre 2009)

Ce n'est pas si simple. Il faudrait déjà comprendre le fonctionnement de HTTP, ce qui ne semble pas être ton cas (au vu de ta question 2).
Ensuite, je te conseille de passer par Apache HttpClient pour te connecter sur la page web distante.


----------



## dmo95 (27 Septembre 2009)

Pourquoi ne pas attaquer la BDD directement avec JAVA, bien sur si tu as les droits ?

Au quel cas regarde du côté de JDBC.


----------



## Bazinga (3 Octobre 2009)

Bon, bien voilà; je me suis maintenant renseigné énormément sur les formulaires.

J'ai fait mon script qui atteint des pages de formulaires get en bidouillant l'URL, tout se passe tres bien, j'affiche bien toutes les infos nécessaires.

Par contre, pour le POST, j'avoue ne rien comprendre et me demande si il n'était pas possible d'avoir un exemple programmé sous les yeux.

Je ne pense pas que ce soit du long code ou que l'exercice soit difficile, mais je galere vraiment à lire tout seul dans mon coin pleins de docs éparpillées.

Merci à celui qui aura la patience de me partager quelques lignes de code pour y arriver, ce serait super sympa!


----------



## Gz' (5 Octobre 2009)

"java url post example" sur google


```
try {
        // Construct data
        String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
        data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");
    
        // Send data
        URL url = new URL("http://hostname:80/cgi");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data);
        wr.flush();
    
        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            // Process line...
        }
        wr.close();
        rd.close();
    } catch (Exception e) {
    }
```


----------



## Bazinga (9 Octobre 2009)

Salut,

Merci pour ton code.

Cela fait maintenant quelques jours que je le retourne et il ne semble pas vraiment fonctionner...

J'ai essayé par exemple avec ce site: http://www.railtime.be/website/default.aspx

en mettant un train "913" par exemple dans le champs input nommé: "M$C$trainNumberTextBox"



Le code source renvoyé par ce code n'a rien à voir avec la réponse attendue ni la page de départ.. Je me demande vraiment d'ou il sort...


Merci pour les infos, mais je pense que je n'arriverai jamais à voir ma réponse...


----------



## Gz' (10 Octobre 2009)

Il te sort quoi comme réponse ?


----------



## Bazinga (10 Octobre 2009)

waw 06h25 du mat pour me répondre...

En fait, copier les codes entiers des pages web sur le forum serait un peu lourd...

Mais avec mon code personnel, j'arrive à lire la page web avec le formulaire... Il me sort un code que je vais appeler HTML1, qui est bien identique à celui que j'obtient avec le navigateur web en me rendant sur la page.

J'utilise alors ton code java pour remplir le formulaire avec les réponses et passer à la page avec les destinations du train et il me renvoie un code HTML2 qui est sensiblement différent de HTML3 qui est celui que j'obtient avec le navigateur.

Dans celui du navigateur, j'ai les différentes destinations du train, que je peux facilement extraire par un script. ( ce qui ets évidemment le but de l'appli)


J'ai copié les différents codes sources dans un fichier texte pour voir le résultat, mais il se trouve évidemment que les pages créées sont visuellement différentes de celles du site ( logique car les images ne chargent pas, etc...)

Pourrais-je te contacter par mail et tenter de regarder ensemble à celà? Cela fait maintenant 2 semaines que je coince sur ce probleme ( j'ai aussi essayé avec le site Google et n'importe quelle page web avec formulaire mais rien n'y fait)`


Je pense que si tu t'y connais un peu, je ne devrais pas prendre plus de 15 minutes de ton temps!

Merci et désolé pour le dérangement


----------



## iota (10 Octobre 2009)

Salut,

j'ai regardé rapidement le site que tu tentes d'utiliser.
Le formulaire est soumis via une fonction Javascript qui (je présume, je n'ai pas regardé en détail le code), applique un traitement aux champs du formulaire avant de le soumettre réellement.

Donc tu ne peux pas te contenter d'appeler uniquement l'action associée au formulaire.

Eventuellement, je t'invite à tracer (avec ethereal, tcpdump) les échanges HTTP entre ton navigateur et le site en question. Analyse le corps de la requête soumise pour t'en inspirer.

@+
iota


----------



## Bazinga (11 Octobre 2009)

merci pour se sprécisions iota...

Je n'ai malheureusement pas le courage vu le boulot de m'investir dans de telles recherches. Ayant déjà développé un code de feu pour utiliser les informations de la page web, je suis dépité de voir qu'il va m'être si compliqué d'atteindre la page d'un train!

Dommage qu'une opération anodine soit si compliquée!


----------



## iota (11 Octobre 2009)

Salut.



profete162 a dit:


> Dommage qu'une opération anodine soit si compliquée!


Justement, ce n'est pas anodin... Ce n'est pas pour rien si j'ai précisé dès le début que ce n'était pas une bonne idée 

Tu détournes l'utilisation d'un page Web, c'est clairement de la bidouille. Je ne suis pas étonné que tu n'arrives pas au résultat escompté.

Mais bon, il y a quand même quelque chose à retenir de tout ça (tout du moins techniquement).

@+
iota


----------



## Bazinga (11 Octobre 2009)

Merci pour les infos, j'ai effectivement appris énormément sur ce fil.

Il est juste difficile, pour un "programmeur du dimanche" de se rendre compte que mettre 913 ou n'importe quel autre chiffre dans un champs et voir le résultat soit si compliqué.

J'ai bien compris la lecon en tous cas!


----------



## Gz' (12 Octobre 2009)

profete162 a dit:


> waw 06h25 du mat pour me répondre...
> 
> En fait, copier les codes entiers des pages web sur le forum serait un peu lourd...
> 
> ...



Si je réponds si tôt c'est que je n'habite pas en France.

Sinon, oui je veux bien essayer de t'aider, tu peux me contacter par MP et m'expliquer en détail.


----------

