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

 Delphi Discussion :

Effectuer un POST d'un formulaire


Sujet :

Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut Effectuer un POST d'un formulaire
    Bonjour,

    Je ne sais pas trop si je dois poster ici ou dans la zone Web & réseau alors je poste ici.

    J'utilise Delphi 7
    Mon but est d'ouvrir un navigateur et d'effectuer le POST d'un formulaire.
    J'ai vu la discussion suivante qui semblait répondre exactement à ma problématique :
    http://www.developpez.net/forums/d81...ge-web-p-post/

    J'utilise ce code pour lancer le navigateur
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecuteW(0, 'open', PWideChar(WideString(url)), nil, nil, SW_RESTORE);

    Le problème est que le navigateur par défaut (IE) bloque l'ouverture de la page car il restreint l'exécution du script.
    Voici le code HTML du fichier en question :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <html>
    <body onLoad="document.forms[0].submit()">
    <form name="myform" method="POST" action="https://preprod-xxx.com/default">
    <input type="hidden" name="_param1" value="AAA">
    <input type="hidden" name="_param2" value="BBB">
    <input type="hidden" name="_param3" value="CCC">
    </body>
    </html>

    Y'a t-il un moyen d'éviter ce phénomène car suivant les configuration, soit on a le message pour autoriser l'exécution, soit rien ne se passe ?

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Tu peux utiliser simplement le TIdHTTP des Indy :

    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
    function PostExample: string;
    var
      IdHTTP: TIdHTTP;
      ParamList: TStringList;
    begin
      ParamList := TStringList.Create;
      ParamList.Add('_param1=AAA');
     
      IdHTTP:= TIdHTTP.Create(nil);
      try
        Result := IdHTTP.Post('https://preprod-xxx.com/default', ParamList);
      finally
        IdHTTP.Free;
        ParamList.Free;
      end;
    end;

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    L'astuce du POST via un <BODY onLoad="Javascript:document.forms['...'].submit();"> dans un fichier, je l'avais utilisé en 2004 sous D7 avec un TWebBrowser.Navigate2('file:///c:...');.
    Cela fonctionnait très bien mais à l'époque c'était IE6
    Et si une fenêtre de dialogue s'affichait, j'avais mon SilentMsgBox pour la fermer via un TTimer,

    Le problème d'Indy c'est si c'est un POST d'une page Web où il faut être connecté (page de login) avant et que l'on a besoin par exemple d'une variable de session
    Je n'ai jamais réussi à le faire

    Pour un POST sur un WebService, Indy est l'une des méthodes, HttpOpenRequest en est une autre
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Bonjour,

    Je me rends compte à présent que je n'ai pas été assez précis dans mon message.
    Je ne peux pas utiliser Indy.
    A priori, ça ne passerait pas les proxy.

    J'ai bien essayé de passer par HttpOpenRequest (d'ailleurs le lien que fournit Shai, c'est l'une des discussions que j'ai ouverte).
    Sauf qu'évidemment il ne s'agit pas cette fois d'appeler un web service et en retour j'ai le code HTML de la page invoquée par le post.
    A moins qu'il y ai une astuce pour faire traiter ce retour par le navigateur par défaut, je ne vois pas comment m'en servir.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Tu peux écrire dans le Body.InnerHTML d'un TWebBrowser en embarqué dans le programme
    J'ai constaté que si le TWebBrowser n'est pas affiché, il ne traite pas grand chose
    Du vieux code datant de D7 et I6
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Tu interceptes le code envoyer par le navigateur en manuel (avec firefox tu as un module qui permet de contrôler chaque appel) ou encore tu décortiques le post et tu recrées l'adresse requête. Parfois la requête est affichée en clair dans la barre d'adresse, (plus en plus rare).

    Soit tu utilises NMHTTP, si tu as Delphi 6 et moins; (Fonctionne de moins en moins, les serveurs bloquent cet antiquité)
    Soit tu utilises webbrowser puis tu dois récupérer le code HTML via des fonctions spéciales...
    Soit indy.
    Il y a PBear mais j'ai jamais utiliser.
    Il semblerait qu'il y ait moyen d'utiliser firefox pour automatiser à la manière de IE (webbrowser).

    Parfois, décortiquer le post n'est pas de la tarte: il faut en plus utiliser des fonctions javascript inclus dans le HTML pour lancer la requête, etc.

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Merci Shai mais le WebBrowser de Delphi n'est pas capable d'afficher des pages modernes.
    En 2001, il avait déjà du mal avec certains CSS..

    sgmsg, je crois que tu n'as pas compris mon besoin.
    Je ne peux pas utiliser Indy à moins de connaître à l'avance comment passer le proxy.
    De plus je ne cherche pas à interpréter un POST, je cherche comment le déclencher automatiquement sans que le navigateur me bloque.

    Au final, j'ai reproduis le look de la page où je suis sensé arriver et ajouté un bouton accompagné d'un texte invitant à cliquer sur le bouton.
    C'est le client qui validera le post.

    Je clos le sujet.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Désolé

    Tu remplis chaque champ du formulaire. Puis tu simules un clique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        function RemplisFormulaire(navigateur:twebbrowser;informations:string):boolean;
        function CliqueLien(navigateur:twebbrowser;informations:string):boolean;
        function CliqueFormulairehtml(navigateur:twebbrowser;informations:string):boolean;
        function CliqueFormulaireJavaScript(navigateur:twebbrowser;informations:string):boolean;
        function RemplisEtCliqueFormulaire(navigateur:twebbrowser;informations:string):boolean;//tu fais tout ce que tu recherches avec cette fonction
    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
    function RemplisEtCliqueFormulaire(navigateur:twebbrowser;informations:string):boolean;
    var l:tstringlist;s:string;
    begin
        l:=tstringlist.create;
        l.Text:=informations;
        result:=false;
        try
           s:=l[l.count-1];
           l.Delete(l.count-1);
     
           if RemplisFormulaire(navigateur,l.Text) then
              if cliquelien(navigateur,s) then result:=true else
              if CliqueFormulairehtml(navigateur,s) then result:=true else
              if CliqueFormulaireJavaScript(navigateur,s) then result:=true;
        except
           result:=false;
        end;
        l.free;
    end;
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    function RemplisFormulaire(navigateur:twebbrowser;informations:string):boolean;
    //informations contient les chaines séparé par #13
    //Chaque mot est séparé par des espaces
     
    var
      i,j,k,ii: Integer;
      FormItem: Variant;
     
      l,m:tstringlist;
     
    begin
        Result := informations='';
        if result then exit;
        if (navigateur.OleObject.Document.all.tags('FORM').Length = 0) and
           (navigateur.OleObject.Document.all.tags('form').Length = 0)
                                                                     then Exit;   //no form on document
        l:=tstringlist.create;l.text:=informations;
        m:=tstringlist.create;m.delimiter:=',';
        //count forms on document
        for I := 0 to navigateur.OleObject.Document.forms.Length - 1 do begin
            FormItem := navigateur.OleObject.Document.forms.Item(I);
            for j := 0 to l.count-1 do begin //tout les champs a remplir
                m.delimitedtext:=l[j];
                for k:=0 to FormItem.Length - 1 do if m.count>1 then try
                    for ii:=0 to m.count-2 do if (FormItem.Item(k).id = m[ii]) or (FormItem.Item(k).name = m[i]) then begin
                        FormItem.Item(k).Value :=m[m.count-1];
                        result:=true;//si on rempli au moin une case c'est bon
                        break;//termine la boucle ii car succèes
                    end;
                except
                    l.free;
                    m.free;
                    exit;
                end;
            end;
        end;
        l.free;
        m.free;
    end;
     
     
     
     
     
    function CliqueFormulaireHTML(navigateur:twebbrowser;informations:string):boolean;
    var
      doc         : ihtmldocument2;
      Collection  : IHTMLElementCollection;
      IDP         : IDispatch;
      i           : integer;
      InputButton : HTMLInputButtonElement;
      l:tstringlist;
     
    begin
        result:=false;
        l:=tstringlist.create;l.DelimitedText:=informations;
        doc := (navigateur.document as ihtmldocument2);
        if Assigned(doc) then begin
            IDP := Doc.all.tags('input');
            if Assigned(IDP) then begin
                IDP.QueryInterface(IHTMLElementCollection, Collection);
                if Assigned(Collection) then begin
                   for i := 0 to Collection.Get_length-1 do begin
                      IDP:= Collection.item(i, 0);
                      IDP.QueryInterface(HTMLInputButtonElement{HTMLInputImage{}, InputButton);
                      if (InputButton.Name = l[0]) or (InputButton.Id = l[0]) then begin
                          InputButton.Click;
                          result:=true;
                          break;
                      end;
                   end;
                end;
            end;
        end;
        l.free;
     
    end;
     
    function CliqueLien(navigateur:twebbrowser;informations:string):boolean;
    var
        i: integer;
        ovLinks: OleVariant;
        l:tstringlist;
    begin
        result:=false;
        l:=tstringlist.create;l.DelimitedText:=informations;
        ovLinks := navigateur.OleObject.Document.all.tags('A');//extrait les liens
        if ovLinks.Length > 0 then begin
            for i := 0 to ovLinks.Length-1 do begin
                if Pos(l[0], ovLinks.Item(i).href) > 0 then begin
                    ovLinks.Item(i).click;
                    Break;
                end;
            end;
         end;
        l.free;
    end;
     
    function CliqueFormulaireJavaScript(navigateur:twebbrowser;informations:string):boolean;
    var l:tstringlist;
        //s:string;
        iWindow : IHTMLWindow2;
        iDoc : IHTMLDocument2;
    begin
        result:=false;
        iDoc := navigateur.Document as IHTMLDocument2;
        if not Assigned(iDoc) then Exit;
        l:=tstringlist.create;
        l.Text:=informations;
        try
            iWindow := iDoc.parentWindow;
            iWindow.execScript('javascript:document.getElementById(' + QuotedStr(l[0]) + ').click();', 'javascript');
            result:=true;
        except
        end;
        l.free;
    end;
     
    function RemplisEtCliqueFormulaire(navigateur:twebbrowser;informations:string):boolean;
    var l:tstringlist;s:string;
    begin
        l:=tstringlist.create;
        l.Text:=informations;
        result:=false;
        try
           s:=l[l.count-1];
           l.Delete(l.count-1);
     
           if RemplisFormulaire(navigateur,l.Text) then
              if cliquelien(navigateur,s) then result:=true else
              if CliqueFormulairehtml(navigateur,s) then result:=true else
              if CliqueFormulaireJavaScript(navigateur,s) then result:=true;
        except
           result:=false;
        end;
        l.free;
    end;

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

Discussions similaires

  1. lien avec XML en Post via un formulaire
    Par epeichette dans le forum Langage
    Réponses: 1
    Dernier message: 19/11/2009, 22h32
  2. submit() et method post (envoie de formulaire en js)
    Par omageus dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/05/2009, 19h11
  3. [INDY]Post d'un formulaire de session (https)
    Par ghost942 dans le forum Web & réseau
    Réponses: 0
    Dernier message: 23/09/2007, 02h53
  4. [Http] effectuer le POST d'un fichier
    Par GuanoSlade dans le forum Delphi
    Réponses: 1
    Dernier message: 20/01/2007, 14h34
  5. [urllib, urllib2] Probleme de post d'un formulaire web asp.net
    Par crimsonPhantom dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 28/09/2006, 15h39

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