Comment puis-je remplir par programme un formulaire Web avec JAVA?


, j'ai juste besoin d'aide pour remplir un formulaire web par programmation avec java. J'utilise Apache HttpClient 4.0.1. La forme ressemble à ceci:
Exemple de Formulaire Web

Le code HTML de celui-ci ressemble à ceci:

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" <ol>Some tags</ol> <ol> 
Do not show the ticket (pre)view when the user first comes to the "New Ticket" page.

Wait until they hit preview. Ticket Box (ticket fields along with description)</ol> <ol>form action="/tracenvir/newticket" method="post" id="propertyform"--div--input type="hidden" name="__FORM_TOKEN" value="dff95a43ddec5a653627d2c0"</ol>

<ol>input type="text" id="field-summary" name="field_summary" size="70"</ol> <ol>textarea id="field-description" name="field_description" class="wikitext" rows="10" cols="68"</ol> <ol>input type="hidden" name="field_status" value="new" </ol> <ol>

      input type="submit" name="preview" value="Preview" </ol> <ol>

      input type="submit" name="submit" value="Create ticket"</ol>

Et il y a beaucoup d'autres balises. Voici mon code java:

DefaultHttpClient client = new DefaultHttpClient();

    client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH);

    client.setCookieStore(new BasicCookieStore());


    //**LOG IN**//


    //System.setProperty("javax.net.ssl.trustStore", "/home/rauch/NetBeansProjects/jssecacerts");

    HttpGet login = new HttpGet("http://localhost:8000/tracenvir/login");

    client.getCredentialsProvider().setCredentials(AuthScope.ANY,

            new UsernamePasswordCredentials("rauch", "qwerty"));

Puis Connectez-vous correctement... Je reçois 200 OK et tout va bien.

    //**POST NewTicket**

    HttpPost post = new HttpPost("http://localhost:8000/tracenvir/newticket");

    List<NameValuePair> formparams = new ArrayList<NameValuePair>();

        formparams.add(new BasicNameValuePair("__FORM_TOKEN", cookies.get(1).getValue()));

        formparams.add(new BasicNameValuePair("field_summary", "Someerror"));

        formparams.add(new BasicNameValuePair("field_descryption","AnyDescryption"));

        formparams.add(new BasicNameValuePair("field_type", "defect"));

        formparams.add(new BasicNameValuePair("field_priority", "major"));

        formparams.add(new BasicNameValuePair("field_milestone", "milestone3"));

        formparams.add(new BasicNameValuePair("field_component", "comp2"));

        formparams.add(new BasicNameValuePair("field_version", "1.0"));

        formparams.add(new BasicNameValuePair("field_keywords", ""));

        formparams.add(new BasicNameValuePair("field_cc", ""));

        formparams.add(new BasicNameValuePair("field_owner", "java server"));

        formparams.add(new BasicNameValuePair("field_status", "new"));

        formparams.add(new BasicNameValuePair("submit", "Create ticket"));

    try {

        UrlEncodedFormEntity entity;

        entity = new UrlEncodedFormEntity(formparams, "UTF-8");

        post.setEntity(entity);

        post.addHeader("Referer","http://localhost:8000/tracenvir/newticket");


        HttpResponse response = client.execute(post);


        System.out.println("Create ticket: "+response.getStatusLine());


        client.getConnectionManager().shutdown();


    } catch(UnsupportedEncodingException ex) {

        ex.printStackTrace();

    } catch(IOException ex) {

        ex.printStackTrace();

    }

Et Les réponses du serveur HTTP/1.0 200 OK . Mais ce "Nouveau ticket" n'apparaît pas sur la page Web ViewTickets. Si je ne l' même chose avec un navigateur Web normal, remplissez les champs et appuyez sur le bouton "Créer un ticket" tout est OK et je peux voir ce NewTicket sur la page Web ViewTickets. Voici ce que le navigateur génère demande:

__FORM_TOKEN=0856803edd721d8b9592231d&field_summary=fuckingStatusField&field_description=mmm+status&field_type=defect&field_priority=major&field_milestone=milestone1&field_component=component1&field_version=2.0&field_keywords=&field_cc=&field_owner=ubuntu-server&field_status=new&submit=Create+ticket)</ol>

Pourquoi ça ne marche pas? Par défaut je ne devrais pas utiliser ceci:

formparams.add(new BasicNameValuePair("__FORM_TOKEN", cookies.get(1).getValue()));

DefaultHttpClient doit le faire, mais ce n'est pas le cas. Si je commente cette déclaration, les réponses du serveur HTTP / 1.0 400 Bad Request

Que dois-je faire pour remplir correctement ce formulaire?

J'ai essayé de imitez le navigateur: Obtenez d'abord la page /newticket, Puis générez une demande de publication avec des en-têtes comme le navigateur génère.....Mais par programme, j'ai 200 OK du serveur, mais ce NewTicket n'apparaît pas dans la liste des tickets.

Author: Samuel Spencer, 2009-12-14

2 answers

  1. Utilisez un utilitaire de capture de paquets tel que Wireshark pour surveiller les requêtes http.

  2. Comparez ce que le navigateur envoie à ce que votre code envoie.

  3. Modifiez votre code en conséquence.

 4
Author: Andrew Strong, 2009-12-14 21:29:57

Composants Http Apache (ou l'ancien HttpClient), Selenium, HtmlUnit - dépend de votre cas exact

 4
Author: Bozho, 2015-01-13 16:36:52