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 :

IdHttp.post ne retourne rien


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut IdHttp.post ne retourne rien
    Bonjour à tous,

    Je souhaiterais poster des données sur un serveur web (php)
    Le serveur reçoit bien la requête mais je n'arrive pas à lire les données en retour, la chaine est toujours vide.

    Voici mon code de test que j'ai trouvé sur internet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
      reponse,params: TStringStream;
    begin
       reponse := TStringStream.Create;
       Params  := TStringStream.Create('param1=Value1&param2=value2&param3=Value3', TEncoding.UTF8);
       IdHTTP1.Post('http://www.crystalxe.com/test.php', Params,reponse);
       ShowMessage(Reponse.DataString);
       ShowMessage(IdHttp1.ResponseText); // affiche 'HTTP/1.1 200 OK'
       Params.Free;
       Reponse.Free;
    end;
    et voici le code php de la page test.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
      echo "YES";
      sleep(2);
    ?>

    Si je change la valeur du sleep dans la page PHP, le temps de retour varie bien en conséquence ce qui confirme que j'accède bien à la page.

    merci
    Franck

  2. #2
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

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

    Informations forums :
    Inscription : mars 2006
    Messages : 219
    Points : 368
    Points
    368
    Par défaut
    Bonjour

    La propriété ResponseText n'est pas le retour à traiter après dans ton code. Elle représente le message de ton serveur sur le déroulement de l'opération POST que tu as appelée.
    Il faut gérer le retour dans une autre variable de type TStringStream dans laquelle tu copies le document du composant Indy et se positionner au début du flux contenu dans cette variable.

    Voici un bout de code qui pourra t'aider :

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      reponse,params: TStringStream;
      OutPut: TStringStream;
    begin
       reponse := TStringStream.Create;
       Params  := TStringStream.Create('param1=Value1&param2=value2&param3=Value3', TEncoding.UTF8);
       OutPut  := TStringStream.Create;
       try
         IdHTTP1.Post('http://www.crystalxe.com/test.php', Params,reponse);
     
         OutPut.CopyFrom(IdHttp1.Document, 0);
         OutPut.Seek(0,soFromBeginning);
         ShowMessage(OutPut.DataString); // Afficher le retour du serveur Php
     
         ShowMessage(Reponse.DataString);
         ShowMessage(IdHttp1.ResponseText); // affiche 'HTTP/1.1 200 OK'
       finally
         Params.Free;
         Reponse.Free;
         OutPut.Free;
       end;
    end;
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut
    bonjour,

    Merci pour ta réponse.
    Je suis en dialogue avec une personne de chez Embarcadero en Californie qui participe aussi au développement du composant IdHTTP (d'ailleurs son nom figure dans les sources), il s'agit de Remy Lebeau.
    voici le thread https://forums.embarcadero.com/messa...ssageID=779980
    Sinon, tu as raison, reponsetext est bien un acquittement.
    En revanche la réponse devrait bien se trouver dans "reponse.datastring" et d'ailleurs, ce code fonctionne depuis chez moi ou en passant par mon mobile en hotspot wifi mais pas à travers le réseau de mon entreprise.
    J'ai voulu essayer ton code mais la propriété IdHttp1.Document est inconnue dans ma version de XE5.
    Et puis après analyse de la trame par wireshark, la réponse n'est pas dans la trame donc elle ne peut pas arriver jusqu'au composant IDHTTP.

    Il y a quelque chose qui bloque au niveau du réseau de mon entreprise (firewall ou autre?)
    Mais j'ai comparé avec un explorateur comme firefox et ça marche, le POST envoyé par firefox semble plus lui plaire que celui envoyé par IDHTTP.
    (voir mes thread dans le lien ci-dessus)
    Je donnerai une réponse en francais ici lorsque j'aurai trouvé la solution.

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 907
    Points : 20 831
    Points
    20 831
    Par défaut
    J'ai testé ton code fourni dans ton 1er message, aucun soucis, cela affiche "YES !!!"
    XE2 sous W7 via un réseau d'entreprise
    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

  5. #5
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    J'ai testé ton code fourni dans ton 1er message, aucun soucis, cela affiche "YES !!!"
    XE2 sous W7 via un réseau d'entreprise
    Merci d'avoir fait l'essai cela prouve qu'il y a quelque chose qui bloque les requêtes IDHTTP dans mon entreprise mais pas firefox ni autres navigateurs...

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 907
    Points : 20 831
    Points
    20 831
    Par défaut
    Au fait, Idem, je n'ai pas de propriété Document dans TIdHTTP

    As-tu essayé avec les composants ICS pour voir si cela vient d'Indy ?

    j'ai repris le code la FAQ Comment télécharger un fichier en Http sans utiliser Indy ?

    il te faudra utiliser HttpOpenRequest et HttpSendRequest pour émettre les données du POST

    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
    procedure T1Form1.btn1Click(Sender: TObject);
    const BufferSize = 1024;
    var hSession, hURL: HInternet;
        Buffer: array[1..BufferSize] of Byte;
        BufferLen: DWORD;
        f: File;
        sAppName: string;
        FS:TStringStream;
    begin
         sAppName := ExtractFileName(Application.ExeName);
     
         hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
     
         FS := TStringStream.Create();
         try
            hURL := InternetOpenURL(hSession, PChar('http://www.crystalxe.com/test.php'), nil,0,0,0);
            try
               repeat
                 InternetReadFile(hURL, @Buffer, BufferSize, BufferLen);
                 FS.WriteBuffer(Buffer, BufferLen);
     
               until BufferLen = 0;
     
     
               ShowMessage(FS.DataString);
            finally
              InternetCloseHandle(hURL)
            end
         finally
             InternetCloseHandle(hSession);
             FS.Free;
         end;
    exit;
    EDIT la version HttpOpenRequest retourne YES !!!
    mais j'ignore si le Data passe correctement :


    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
    procedure T1Form1.btn1Click(Sender: TObject);
    const
      BufferSize = 1024;
      accept: packed array[0..1] of LPWSTR = (PChar('text/*'), nil); // PCTSTR rgpszAcceptTypes[] = {_T(“text/*”), NULL};
    var
        hSession, hHTTP, hReq : HINTERNET;
        Buffer: array[1..BufferSize] of Byte;
        BufferLen: DWORD;
        f: File;
        sAppName: string;
        FS:TStringStream;
        Headers: string;
        Data: RawByteString;
    begin
     
        sAppName := ExtractFileName(Application.ExeName);
     
        hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
        try
          hHTTP := InternetConnect(hSession, 'www.crystalxe.com', INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
          try
            hReq := HttpOpenRequest(hHTTP, PChar('POST'), 'test.php', nil, nil, @accept, 0, 1);
            try
              Headers := 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';
              Data := UTF8Encode('param1=Value1&param2=value2&param3=Value3');
              if HttpSendRequest(hReq, PChar(Headers), length(Headers), PAnsiChar(Data), length(Data)) then
              begin
                FS := TStringStream.Create();
                try
                  BufferLen := 0;
                  repeat
                    if InternetReadFile(hReq, @Buffer, BufferSize, BufferLen) then
                      FS.WriteBuffer(Buffer, BufferLen);
     
                  until BufferLen = 0;
     
                             ShowMessage(FS.DataString); // YES !!!
                finally
                  FS.Free;
                end;
              end
              else
                raise Exception.Create('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
            finally
              InternetCloseHandle(hReq);
            end;
          finally
            InternetCloseHandle(hHTTP);
          end;
        finally
          InternetCloseHandle(hSession);
        end;
     
     
    exit;
    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

  7. #7
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

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

    Informations forums :
    Inscription : mars 2006
    Messages : 219
    Points : 368
    Points
    368
    Par défaut
    Bonjour
    En faite, j'ai eu une petite confusion entre les composants Indy (TIdHttp) et ceux des Ararat Synapse (le THttpSend) puisque je travaille avec les 2 dans pas mal de projets. Donc
    Évidement, le Reponse.DataString est bien le retour de votre appel Http sur votre serveur.
    Il y a plusieurs variantes du post d'un TIdHttp, je crois que celle ci fera bien l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TIdCustomHTTP.Post(AURL: string; const ASourceFile: String; AResponseContent: TStream);
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  8. #8
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut
    Merci ShaiLeTroll ! cela fonctionne bien avec HttpOpenRequest et HttpSendRequest, là ou ça ne marchait pas avec Indy.

    Il y a donc un truc qui bloque dans indy mais quoi ?

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 907
    Points : 20 831
    Points
    20 831
    Par défaut
    Indy c'est directement codé par dessus leur couche TCP/IP, c'est totalement à la main !
    Indy lui pose parfois problème, certains mails n'arrivent pas au destinataire car bloquer quelques part, tu l'envoie via Outlook et ça passe !

    Les Api Windows, ont peut penser que celle d'IE sont les mêmes
    en tous cas, lorsque je les ai utilisé il y a un paquet d'année, le passage de IE6 à IE7 fut douloureux changeant tous les TimeOut par défaut de 60min à 30s,
    d'un coup, de longue requête SOAP qui était longue à calculer s'arrêtaient net !
    IE7 en plus plantait sur InternetQueryOption : "Taille Insuffisante pour Appel Système"
    Heureusement IE8 lui ne plantaient pas lorsque l'on changeait les TimeOut avec InternetQueryOption
    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

  10. #10
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    septembre 2004
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : septembre 2004
    Messages : 430
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Indy c'est directement codé par dessus leur couche TCP/IP, c'est totalement à la main !
    Indy lui pose parfois problème, certains mails n'arrivent pas au destinataire car bloquer quelques part, tu l'envoie via Outlook et ça passe !

    Les Api Windows, ont peut penser que celle d'IE sont les mêmes
    en tous cas, lorsque je les ai utilisé il y a un paquet d'année, le passage de IE6 à IE7 fut douloureux changeant tous les TimeOut par défaut de 60min à 30s,
    d'un coup, de longue requête SOAP qui était longue à calculer s'arrêtaient net !
    IE7 en plus plantait sur InternetQueryOption : "Taille Insuffisante pour Appel Système"
    Heureusement IE8 lui ne plantaient pas lorsque l'on changeait les TimeOut avec InternetQueryOption
    Merci encore ShaiLeTroll, je vois que tu maitrises le sujet à fond !
    bravo.

Discussions similaires

  1. [AJAX] post() ne me retourne rien
    Par amdawb dans le forum jQuery
    Réponses: 10
    Dernier message: 09/03/2015, 22h03
  2. [Java][debutant]select count(*) ne retourne rien !!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/01/2007, 12h39
  3. Erreur query ne retourne rien
    Par TeddyBEER dans le forum Outils
    Réponses: 3
    Dernier message: 28/04/2006, 16h09
  4. Si mysql ne retourne rien que faire ?
    Par pierrera dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/02/2006, 12h12
  5. SELECT qui ne retourne rien à cause d'anti-slash
    Par mikyfpc dans le forum Outils
    Réponses: 8
    Dernier message: 08/08/2005, 00h04

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