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 :

HTTP POST En Boucle Pour Chaque Item


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Par défaut HTTP POST En Boucle Pour Chaque Item
    Bonjour tout le monde,

    Me revoilà, un peu perdu, avec un nouveau problème tout simple j'en suis sur.

    Je dois effectuer un POST HTTP avec Indy pour chaque Item d'un ListBox.
    Pour le moment, mon code donne ça :
    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
    for Index := 0 to Form1.ListBox1.Items.Count -1 do
    begin
        http := TIDHttp.Create(nil);
        http.HandleRedirects := True;
        http.ReadTimeout := 5000;
        param := TStringList.create;
        param.Clear;
     
        param.Add('login='+Form1.Edit1.Text);
        param.Add('password='+Form1.Edit2.Text);
        param.Add('post=submit');
        valid := True;
        url := ListBox1.Items[Index];
     
        try
          Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(Form1.IdHttp1.Post, #10, #13#10)+' : SUCCESS');
        except
          on E: Exception do
          Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(Form1.IdHttp1.Post, #10, #13#10)+' : FAILED');
        end;
    end;
    Ça fonctionne pour le premier Item mais ça ne passe pas au suivant...
    Ça me semble assez basique alors j'ai du louper quelque chose.

    Comme c'est la première fois que j'utilise Indy et POST (...) je me demande si le problème ne vient pas d'une erreur serveur qui stop le process... (?)
    Car à chaque fois que j'essai de faire un POST (in ou hors de la boucle) j'obtiens une 'erreur' 302 FOUND, alors que le POST s'est pourtant correctement effectué.

    Et c'est pas terminé (oui, désolé) : peu importe la réponse du serveur, aucune ligne SUCCESS ou FAILED n'est ajoutée au RichEdit1...

    Mon cerveau à trop chauffé aujourd'hui, j'ai besoin d'une pause et d'un peu d'aide
    Mille mercis par avance !

    Beny

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    Salut,

    Ca ne viendrait pas du fait que dans ta boucle tu essayes de recréer à chaque fois ton composant?

    http := TIDHttp.Create(nil);
    Soit tu le libères dans la boucle, soit tu le crée en dehors et tu le libères à la fin. J'ai pas testé, mais je suis presque sur que ça vient de ça

  3. #3
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Je pense que ton problème est que tu utilise la variable http en début de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        http := TIDHttp.Create(nil);
        http.HandleRedirects := True;
        http.ReadTimeout := 5000;
    et IdHttp1 pour utiliser la méthode Post
    Et, je pense que ton composant IdHTTP1 n'as pas la propriété HandleRedirect a true !

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Par défaut
    Merci pour vos idées.
    Effectivement HandleRedirects n'était pas à TRUE et j'avais aussi mélangé ma variable http et le composant IdHTTP1.
    Aussi, comme l'a dit Arsiezis, http n'était jamais libéré (ni param d'ailleurs) :s

    J'ai donc essayé quelque chose comme ça :
    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
    for Index := 0 to Form1.ListBox1.Items.Count -1 do
    begin
        http := TIDHttp.Create(nil);
        http.HandleRedirects := True;
        http.ReadTimeout := 5000;
        param := TStringList.create;
        param.Clear;
     
        param.Add('login='+Form1.Edit1.Text);
        param.Add('password='+Form1.Edit2.Text);
        param.Add('post=submit');
        valid := True;
        url := ListBox1.Items[Index];
     
        try
          Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(http.Post, #10, #13#10)+'SUCCESS');
        except
          on E: Exception do
          Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(http.Post, #10, #13#10)+'FAILED');
        end;
        http.Free;
        param.Free;
    end;
    Alors cette fois si ça semble fonctionner.
    Mais j'ai volontairement modifier mon script PHP afin de générer des erreurs 500 dans le but de tester si l'ajout de ligne FAILED ou SUCCESS foncionnait... Et ça ne fonctionne pas.

    Peu importe la réponse du serveur, rien est ajouté au RichEdit1.
    Strange...

    Merci

    Beny

  5. #5
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Tu es sur que ton code compile ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(http.Post, #10, #13#10)+'SUCCESS');
    Il ne manque pas une parenthèse ?

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Par défaut
    Citation Envoyé par mick605 Voir le message
    As tu essayé d'afficher directement le résultat de Post dans ton RichEdit ?
    Ah non, je n'ai pas essayé...
    Quelque chose comme ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      s : string;
    begin
      {...}
      s := http.Post(Form1.Edit6.Text, param);
      RichEdit1.Lines.Add(s1);
      {...}
    end;
    Essayons

    Beny

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Tu es sur que ton code compile ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(http.Post, #10, #13#10)+'SUCCESS');
    Il ne manque pas une parenthèse ?
    Oui il manque une parenthèse...
    C'est parce-que j'ai raccourci pour poster ici.
    (Mais je ne pense pas que le problème vienne de là car j'avais réussi à lui faire écrire un SUCCESS hors d'une boucle précédemment (...))

    Sinon je viens d'essayer d'écrire le résultat du POST dans mon RichEdit, mais il n'écrit rien...
    Pourtant dans le débugger Delphi j'ai bien un message d'une erreur 500.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        s := http.Post(Form1.Edit6.Text, param);
        Form1.OutputLog.Lines.Add(s);
    Beny

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Par défaut
    Légère avancée :
    Alors la boucle semble s’exécutée correctement, mais toujours impossible d'écrire dans le RichEdit les succès ou erreurs (une sorte de rapport...).

    Pour écrire les erreurs ou succès j'utilise le code ci-dessous mais rien ne ce passe (aucune lignes n'est ajoutées et la ProgressBar ne prend pas le +1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try
      Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(http.Post(Form1.ListBox1.Items[Index], param)), #10, #13#10)+'SUCCESS');
      Form1.ProgressBar1.Position := +1;
      Application.ProcessMessages;
    except
      on E: Exception do
      begin
        Form1.RichEdit1.Lines.Add(AnsiReplaceStr(Utf8ToAnsi(http.Post(Form1.ListBox1.Items[Index], param)), #10, #13#10)+'FAILED');
        Form1.ProgressBar1.Position := +1;
        Application.ProcessMessages;
      end;
    end;
    Une idée ?

    Merci beaucoup de votre aide, je n'avancerai pas sans

    Beny

    UPDATE :

    J'avance un peu...
    J'arrive enfin à écrire "quelque chose" dans le RichEdit avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try  
      http.Post({...}, param); 
      Form1.RichEdit1.Lines.Add(Form1.ListBox1.Items[Index]+' : SUCCESS !');
    except 
       on E: EIdHTTPProtocolException do 
       Form1.RichEdit1.Lines.Add(E.ErrorMessage+' '+Form1.ListBox1.Items[Index]+' : FAILED !');
    end;
    Mais ça m'affiche la source complète de la page.
    Il y a encore des petites choses à améliorer...

    Beny

    PS : Une lecture qui me semble intéressante : http://www.developpez.net/forums/d71...404-not-found/

Discussions similaires

  1. Parsing image pour chaque item d'une ListView
    Par sabrineisimm dans le forum Composants graphiques
    Réponses: 14
    Dernier message: 02/09/2011, 12h16
  2. time (boucle pour chaque seconde)
    Par albertopisto dans le forum Général Python
    Réponses: 2
    Dernier message: 12/08/2011, 16h17
  3. [SWT] Mettre un "id" pour chaque item d'une Combo
    Par CharlyBrok dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 04/09/2009, 17h27
  4. [MySQL] boucle pour chaque entrée dans un champ
    Par boubourse92 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/11/2008, 01h52
  5. Boucle : pour chaque élément d'un ensemble ?
    Par monstroplante dans le forum Langage
    Réponses: 7
    Dernier message: 07/11/2005, 15h45

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