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

Web & réseau Delphi Discussion :

Formatage des paramètres pour HTTPRequest


Sujet :

Web & réseau Delphi

  1. #1
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut Formatage des paramètres pour HTTPRequest
    Bonjour,

    J'utilise les comosants NetHTTPClient et NetHTTPRequest pour accéder à différents sites web.
    Certains nécessitent une authentification via un formulaire, qui ne me pose pas de problème
    Par exemple, pour le site 1, le formulaire est du type:
    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
    <form name="login" id="login" action="https://www.lesite1.com//login" method="post">
    					<table><tr><td>Connexion&nbsp;:&nbsp;</td>
    					<td>
    						<input type="hidden" name="urlRedirection" id="urlRedirection" value="https://www.lesite1.com/">
    					  	<div id="login">
    						    <label for="login-field" class="label">E-mail</label>
    						    <input id="login-field" type="text" name="login" title="E-mail" value=""  >
    						</div>
    						<div id="password">
    						    <label for="password-field" class="label">Mot de passe</label>
    						    <input id="password-field" type="password" name="password" title="Mot de passe" value="" >
    						</div>
    					</td>
    					<td>
    						<div id="submit">
    						    <input type="submit" name="submit" value="Ok" tabindex="3" >
    							<div>
    						</div>
    					</td></tr>
    					</table>
    				</form>
    mon code qui fonctionne parfaitement a la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
      dummy:=tstringList.Create;
        dummy.AddPair('urlRedirection','https://www.lesite1.com') ;
        dummy.AddPair('login','XXXXXX');
        dummy.AddPair('password','YYYYY') ;
        response:= NetHTTPREquest1.post('https://www.lesite1.com/login',dummy);
     
         buffer:=response.ContentAsString;
    end;
    en revanche, pour un autre site, les propriétés "name" des input contiennent des crochets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <div class="form-field identifier">
     
    				<input type="text" id="connection_login" name="connection[login]" required="required" placeholder="Identifiant" class="form-control white" />
    			</div>
    			<div class="form-field password">
     
    				<input type="password" id="connection_password" name="connection[password]" required="required" placeholder="Mot de passe" class="form-control white" />
    			</div>
    et là, mon code semble ne plus fonctionner.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     dummy.AddPair('connection[login]','XXXXXX') ;
        dummy.AddPair('connection[password]','YYYYYY');
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     dummy.AddPair('connection_login','XXXXXX') ;
        dummy.AddPair('connection_password','YYYYYY');
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     dummy.AddPair('login','XXXXXX') ;
        dummy.AddPair(password','YYYYYY');
    mais sans succès. Est-ce qu'il y a une mise en forme particulière à faire?
    7 fois à terre, 8 fois debout

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    y'a vraiment des gens qui ont des idées bizarres

    je ne sais pas, mais pour ce genre de chose, tu peux regarder dans les outils de Chrome au niveau Réseau pour voir sous quelle forme c'est traité...car en fait je ne sais pas ce que ça donne

    ensuite il faut voir comment le faire entrer dans Delphi, et pour ça j'utilise toujours un petit script PHP qui dump ce qu'il reçoit pour voir comment Delphi génère sa requête.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Dans la partie "réseau" des outils , ces paramètres n'apparaissent pas dans la partie "headers". Je les vois dans la rubrique "Payload", sous la forme "connection[login] : XXXX' et sur l'URL brute, ils apparaissent aussi sous la forme connection%5Blogin%5D=XXXXX&connection%5Bpassword%5D=YYYYYY

    J'ai essayé de remplacer les [] par %5B et %5D dans mes headers mais ça n'a rien changé
    J'a bricolé une copie de la page de login en local pour que le "submit" pointe vers un de mes module web pour analyser les données dans l'évènement "WebModuleDefaultAction" mais Request.queryFields est vide (ce qui semble conforme à ce que je vois dans la partie "header" des outils réseau)
    7 fois à terre, 8 fois debout

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    le coup des crochets, c'est probablement parce que la destination est en PHP qui gère ça à l'arrivée sous forme de tableau dans la réponse du $_POST "connexion"
    (à la base ce truc était censé être utilisé pour les fichiers, pas pour faire n'importe quoi, mais bon, c'est le web...)

    quand à gérer ça en Delphi, c'est probablement non pris en charge par l'encodeur de paramètres, m'est avis qu'un TODO sur QP sera le bienvenu, mais ça reste à vérifier

    quoiqu'il en soit tes paramètres doivent s'appeler "connection[login]" et "connection[password]", tu n'as pas le choix, faut donc soit passer en direct le body (urlencodé) de la requête aux composants (qui ne le permettent peut-être pas), soit laisser en paramètres comme n'importe lesquels

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ah tu dois passer par un content-type application/x-www-form-urlencoded

    en regardant dans les sources de System.Net.HttpClient ça apparait dans THTTPClient.CreateFormFromStrings...qui n'est pas documenté

    mais le code montre bien que les paramètres sont transformés sous la forme "nom1=value1&nom2=value2"

    %5B et %5D c'est juste un encodage hexadécimal des [ ], Delphi est supposé le faire tout seul via TNetEncoding.URL.EncodeForm appelé justement dans CreateFormFromStrings

    donc à priori tu dois passer ta StringList à la fonction CreateFormFromStrings pour avoir les paramètres à transmettre à cette version de Post()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function Post(const AURL: string; const ASource: TStream; const AResponseContent: TStream = nil;
          const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ... à priori tu dois passer ta StringList à la fonction CreateFormFromStrings pour avoir les paramètres à transmettre à cette version de Post()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function Post(const AURL: string; const ASource: TStream; const AResponseContent: TStream = nil;
          const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;
    En fait, CreateFormFromStrings est appelée automatiquement par NetHTTPRequest.post et ça ne fonctionne pas. Du coup, je n'ai pas eu plus de succès en utilisant directement HTTPClient
    Je vais laisser tomber ça pour l'instant, j'ai d'autres projets plus urgents.
    Merci à tous les deux pour votre aide
    7 fois à terre, 8 fois debout

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ah oui bon ben je sais pas alors
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. passage des paramètres pour une fonction
    Par monalise dans le forum NetBeans
    Réponses: 4
    Dernier message: 20/08/2009, 09h36
  2. faire passer des paramètres pour fonction d'upload
    Par adeltimple dans le forum Langage
    Réponses: 10
    Dernier message: 16/02/2009, 18h56
  3. Réponses: 1
    Dernier message: 17/05/2008, 22h44
  4. Réponses: 2
    Dernier message: 17/04/2007, 10h56
  5. Réponses: 2
    Dernier message: 28/02/2007, 13h13

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