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 :

Get, Flux XML analyse et affichage en live


Sujet :

Web & réseau Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Get, Flux XML analyse et affichage en live
    Bonjour

    J'ai un programme à réaliser qui consiste à récupérer un flux (j'utilise THttpCli de ICS) avec un GET, sur un serveur (Logiciel embarquant un serveur web). Le serveur me réponds avec un keep-alive pour maintenir la connexion, car ce dernier m'envoie des informations d'état régulièrement en XML. Je souhaite analyser en temps réel ce flux XML.

    Je fais donc le GET dans un thread (je me suis servi des démo de ICS) et j'ai un problème avec l'analyse du XML. En effet, je ne crois pas pouvoir accéder au HttpCli.rcvdstream en même temps en écriture (par le get dans mon thread) et en lecture (par l'affectation à un objet TMemoryStream dans la procédure initiale). Je pensais peut-être me servir d'un fichier temporaire ou d'une pile, mais j'aimerais des conseils avisés avant de me jeter !

    Le but de tout cela est de pouvoir sélectionner les événement contenus dans les messages XML qui m'intéressent.

    Je ne sais pas vraiment comment faire, je (re)débute en programmation et en Delphi en particulier. Merci pour votre aide

  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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonjour

    J'ai un programme à réaliser qui consiste à récupérer un flux (j'utilise THttpCli de ICS) avec un GET, sur un serveur (Logiciel embarquant un serveur web). Le serveur me réponds avec un keep-alive pour maintenir la connexion, car ce dernier m'envoie des informations d'état régulièrement en XML. Je souhaite analyser en temps réel ce flux XML.

    Je fais donc le GET dans un thread (je me suis servi des démo de ICS) et j'ai un problème avec l'analyse du XML. En effet, je ne crois pas pouvoir accéder au HttpCli.rcvdstream en même temps en écriture (par le get dans mon thread) et en lecture (par l'affectation à un objet TMemoryStream dans la procédure initiale). Je pensais peut-être me servir d'un fichier temporaire ou d'une pile, mais j'aimerais des conseils avisés avant de me jeter !

    Le but de tout cela est de pouvoir sélectionner les événement contenus dans les messages XML qui m'intéressent.

    Je ne sais pas vraiment comment faire, je (re)débute en programmation et en Delphi en particulier. Merci pour votre aide
    Si je ne m'abuse ICS fonctionne par événements et non par Thread, tu dois donc avoir un événement qui se déclenche à la réception d'une réponse XML et tu peux alors la traiter non ?

    Ceci dit, quand tu parles de recevoir régulièrement des informations...Keepalive ne sert pas à ça, à moins que tu n'ais fait un raccourci dans ta question.

    KeepAlive permet de garder le socket ouvert pour enchaîner des requêtes sur la même connexion, ce qui impose que la réponse possède dans son entête HTTP un Content-Length qui permet au client de savoir que la réponse est complète et qu'il peut passer à la requête suivante (sinon il attend la fermeture de la connexion).

    En tout état de cause, pour un GET tu n'as qu'une seule réponse quelque soit le mode de connexion !

    Mais il est tout à fait possible d'avoir une réponse "longue" constituée de plusieurs fichiers XML mis bout à bout, le XML lui-même délimitant les différentes parties. Et rien ne t'empêche de traiter la réponse au fur et à mesure de la lecture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    GET / HTTP/1.0
     
    200 OK
    Content-type: text/xml
     
    <!-- premier fichier -->
    <?xml>
    <...>
    </xml>
    <!-- deuximème fichier -->
    <?xml>
    <...>
    </xml>

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci pour ta réponse très rapide.

    Tu as globalement bien compris ma demande malgré mon explication floue :d

    Alors en effet, il y a un événement à chaque réception d'un message complet, la démo de ICS me le fait constater en affichant un message (Sur evt DocBegin, DocEnd)

    Pour le keep-alive, j'ai effectivement fait un raccourci je crois. Je voulais signifier que faisant un get et ne fermant pas la connexion, la requête est bloquante (Donc je la met dans un thread supplémentaire pour effectuer d'autres actions). En gérant correctement les événements DocBegin et Doc End, j'aurais certainement pu me passer d'un thread supplémentaire?

    Voilà ce que j'ai en réponse XML enregistré dans un fichier (Exactement ce que tu as marqué dans ton message ):

    ***********************
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:26
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:26
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:31
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:31
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:36
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:36

    ********************************

    Et en conclusion, ma question est dans ta dernière phrase :

    Comment traiter ce flux à la volée, au fur et à mesure qu'il arrive?

    Faut-il que sur un événement DocData je lance le parser (Qui soit dit en passant attend un paramètre Pchar alors que j'ai un flux Tmemorystream...)? Et ce dans l'unité du thread et pas dans l'unité principale?

    Merci beaucoup pour le soutien

  4. #4
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonjour et merci pour ta réponse très rapide.

    Tu as globalement bien compris ma demande malgré mon explication floue :d

    Alors en effet, il y a un événement à chaque réception d'un message complet, la démo de ICS me le fait constater en affichant un message (Sur evt DocBegin, DocEnd)

    Pour le keep-alive, j'ai effectivement fait un raccourci je crois. Je voulais signifier que faisant un get et ne fermant pas la connexion, la requête est bloquante (Donc je la met dans un thread supplémentaire pour effectuer d'autres actions). En gérant correctement les événements DocBegin et Doc End, j'aurais certainement pu me passer d'un thread supplémentaire?

    Voilà ce que j'ai en réponse XML enregistré dans un fichier (Exactement ce que tu as marqué dans ton message ):

    ***********************
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:26
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:26
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:31
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:31
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:36
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:36

    ********************************

    Et en conclusion, ma question est dans ta dernière phrase :

    Comment traiter ce flux à la volée, au fur et à mesure qu'il arrive?

    Faut-il que sur un événement DocData je lance le parser (Qui soit dit en passant attend un paramètre Pchar alors que j'ai un flux Tmemorystream...)? Et ce dans l'unité du thread et pas dans l'unité principale?

    Merci beaucoup pour le soutien
    je ne comprend pas bien à quoi correspond tes données ci-dessus qui ne sont en tout cas pas de l'XML

    tout va dépendre de ton parser, est-il lui capable de traiter les données à la volée ? c'est à dire de traiter un début de fichier, te rendre la main car il n'a plus de données puis reprendre quand tu lui fournis la suite du fichier ?

    sinon c'est pas très compliqué de copier le Stream d'ICS dans un STRING que tu envoie comme PChar à ton Parser une fois que le flux contient un fichier complet (DocEnd ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      SetLength(str, Stream.size);
      stream.position := 0;
      stream.read(str[1], length(str));
      Parser.Process(PChar(str)); 
     
    //--- ou éventuellement si c'est un MemoryStream
      z := 0;
      stream.write(z, 1); // ajout d'un #0
      Parser.Process(PChar(stream.Memory));

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour

    Merci beaucoup Paul

    J'ai collé la version Texte des messages, pas la version XML (J'ai la possibilité de recevoir en réponse au get le texte ou le xml)

    Je vais regarder tout ça ce soir et demain soir, et revenir donner mon résultat. Je dois analyser les EVENT_DATA_TYPE de chaque message XML (Message qui est compris entre les commentaires "--DigifortBoundary".

    Pour ce qui est du parser, je vais regarder ses capacités.(XML Parser de Stefan Heymann's)

    Pour ce qui est de la copie du string, est-ce que DocEnd donne la fin d'un message ou la fin du fichier complet (Get terminé)? si j'attend la fin de fichier, je risque d'attendre éternellement car c'est justement un monitoring et le flux issu du Get n'est jamais censé s'arrêter.

  6. #6
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonjour

    Merci beaucoup Paul

    J'ai collé la version Texte des messages, pas la version XML (J'ai la possibilité de recevoir en réponse au get le texte ou le xml)

    Je vais regarder tout ça ce soir et demain soir, et revenir donner mon résultat. Je dois analyser les EVENT_DATA_TYPE de chaque message XML (Message qui est compris entre les commentaires "--DigifortBoundary".

    Pour ce qui est du parser, je vais regarder ses capacités.(XML Parser de Stefan Heymann's)

    Pour ce qui est de la copie du string, est-ce que DocEnd donne la fin d'un message ou la fin du fichier complet (Get terminé)? si j'attend la fin de fichier, je risque d'attendre éternellement car c'est justement un monitoring et le flux issu du Get n'est jamais censé s'arrêter.
    ok c'est donc bien un seul GET et une longue réponse...dans ce cas il faudrait passer par OnData en stockant les données dans un buffer tant que le boundary n'est pas atteind.

    mais pourquoi s'embêter avec XML ? le format texte à l'air très bien et très simple

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ok c'est donc bien un seul GET et une longue réponse...dans ce cas il faudrait passer par OnData en stockant les données dans un buffer tant que le boundary n'est pas atteind.

    mais pourquoi s'embêter avec XML ? le format texte à l'air très bien et très simple
    Ah le format texte donc... je pensais vraiment qu'avec uin parser XML je pouvais optimiser la vitesse du code et m'économier quelques lignes de code...

    Bon mais ca change pas grand chose à mon probleme, on n'est pas encore arrivé au parser xml... patience, la question sur "Comment je parcoure mon flux texte" va venir...

    Bon je résume : Je demande au serveur une réponse texte. Je stock cette réponse dans un buffer sur événement ondata. dès que je détecte le commentaire je stocke le contenu du buffer dans un fichier temp que je parcoure pour trouver ce dont j'ai besoin. je clear le buffer et ca repart.

    j'ai bon?

  8. #8
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Ah le format texte donc... je pensais vraiment qu'avec uin parser XML je pouvais optimiser la vitesse du code et m'économier quelques lignes de code...

    Bon mais ca change pas grand chose à mon probleme, on n'est pas encore arrivé au parser xml... patience, la question sur "Comment je parcoure mon flux texte" va venir...

    Bon je résume : Je demande au serveur une réponse texte. Je stock cette réponse dans un buffer sur événement ondata. dès que je détecte le commentaire je stocke le contenu du buffer dans un fichier temp que je parcoure pour trouver ce dont j'ai besoin. je clear le buffer et ca repart.

    j'ai bon?
    presque pourquoi veux-tu passer par un fichier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     sl := TStringList.Create;
     sl.Text := Copy(Buffer, 1, BoundaryPos);
     Delete(Buffer, 1, BoundaryPos + BoundaryLen);
     WriteLn(sl.Values['EVENTDATA_TYPE']);

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 586
    Points : 25 256
    Points
    25 256
    Par défaut
    Si tu veux faire du XML autant passé par WebService SOAP et d'utiliser un ce TXMLData (objet TRemotable, il faut le renommer dans des Delphi récents) qui encapsule le type ANY permettant d'y mettre un XML sans que celui-ci soit parsé en tant que le élément SOAP mais comme du RAW XML !
    Voir si le TXMLData de 2007 est compatible ?!

    Comme l'a souligné Paul Toth, si le format Texte est fonctionnel, autant continuer avec !
    En plus les composants XML sont souvent gourmand en mémoire !

    Pour un (re)débutant, tu ne t'attaques pas au plus facile !

    Le Serveur tu en a aussi la maîtrise ?
    HTTP 1.0 ou 1.1 ? la gestion connexion "persistente" n'est pas la même !
    Au final qu'est ce qui ne fonctionne pas dans ton programme ?
    Je ne connais pas le THttpCli de ICS, j'ai utilisé un TIdHTTP + SSL, et mes GET ne contenait que ce que j'avais besoin, je n'avais plus qu'à lire le contenu et pourtant cela envoyait aussi du XML a parser qui me permettait de récupérer par une autre URL un buffer en Base64 !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonsoir !
    Merci pour cette aide précieuse. Je vais explorer tout ceci et vous ferai part de mon avancée.

    Et oui je ne m'attaque pas au plus facile... mais je n'ai pas vraiment choisi le morceau de tarte à croquer, même si je suis le seul à avoir décidé d'en acheter une.

    Je ne maîtrise pas le serveur, il est embarqué dans l'application (VidéoSurveillance) dont je dois analyser les événements.

    Et au final, j'ai "juste" à appliquer les modifications proposées par Paul avant de vous dire si j'ai toujours un problème ! :d

    Mon principal problème au départ était que je n'avais pas saisi toute la logique des composants que je souhaitais utiliser et que j'avais besoin d'aide pour faire un choix technique avant d'aller plus loin! (Et je n'arrivais pas tout seul à récupérer les données issues du get sachant que la connexion reste ouverte)

    Et merci encore pour votre aide
    Aurelien

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    presque pourquoi veux-tu passer par un fichier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     sl := TStringList.Create;
     sl.Text := Copy(Buffer, 1, BoundaryPos);
     Delete(Buffer, 1, BoundaryPos + BoundaryLen);
     WriteLn(sl.Values['EVENTDATA_TYPE']);
    Bonsoir

    J'ai essayé... j'ai quelques soucis...
    Déjà, je n'arrive plus à obtenir mon flux texte ou xml dans un simple fichier (Tel que je l'ai posté au début). Je me retrouve avec des caractères spéciaux (Du chinois ou du japonais??)

    J'ai essayé d'utiliser diverses méthodes mais rien de concluant. Je remplis un fichier de points d'interrogation...
    Je me demande si j'ai une erreur dans mon code ci-dessous, surtout dans l'événement docData :

    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
     
    procedure TFicheGet.Fermeture(Sender: TObject; var Action: TCloseAction);
    begin
      HttpCli1.Destroy;
    end;
     
    procedure TFicheGet.GoClick(Sender: TObject);
    begin
        HttpCli1               := THTTPCli.Create(Nil);
        HttpCli1.RcvdStream    := TMemoryStream.Create;
        HttpCli1.OnDocData     := HttpCli1DocData;
             with HttpCli1 do begin
             (RcvdStream as TMemoryStream).Clear;
                URL   := 'http://127.0.0.1:8601/Interface/Events/Monitor?AuthUser=admin&ResponseFormat=Xml';
                Get;   // Get
                end;
    end;
     
    procedure TFicheGet.HttpCli1DocData(Sender: TObject; Buffer: Pointer;
      Len: Integer);
      var
      FichTest: TextFile;
      Str:string;
    begin
      AssignFile(FichTest, 'c:\TestGet.txt');
      Append(FichTest);
      SetLength(str, HttpCli1.RcvdStream.size);//init string à la taille du stream
      HttpCli1.RcvdStream.position := 0;
      HttpCli1.RcvdStream.Read(str[1], len);
      ShowMessage(str);
      writeln(FichTest,Str);
      CloseFile(FichTest);
    end;
     
    end.
    J'aimerais également savoir me servir du Buffer transmis en paramètre, ca pourrait être pratique non? Mais c'est un pointeur, et j'avoue ne pas avoir trouvé d'exemple concret pour utiliser ce Buffer correctement.

    Merci !

  12. #12
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonsoir

    J'ai essayé... j'ai quelques soucis...
    Déjà, je n'arrive plus à obtenir mon flux texte ou xml dans un simple fichier (Tel que je l'ai posté au début). Je me retrouve avec des caractères spéciaux (Du chinois ou du japonais??)

    J'ai essayé d'utiliser diverses méthodes mais rien de concluant. Je remplis un fichier de points d'interrogation...
    Je me demande si j'ai une erreur dans mon code ci-dessous, surtout dans l'événement docData :

    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
     
    procedure TFicheGet.Fermeture(Sender: TObject; var Action: TCloseAction);
    begin
      HttpCli1.Destroy;
    end;
     
    procedure TFicheGet.GoClick(Sender: TObject);
    begin
        HttpCli1               := THTTPCli.Create(Nil);
        HttpCli1.RcvdStream    := TMemoryStream.Create;
        HttpCli1.OnDocData     := HttpCli1DocData;
             with HttpCli1 do begin
             (RcvdStream as TMemoryStream).Clear;
                URL   := 'http://127.0.0.1:8601/Interface/Events/Monitor?AuthUser=admin&ResponseFormat=Xml';
                Get;   // Get
                end;
    end;
     
    procedure TFicheGet.HttpCli1DocData(Sender: TObject; Buffer: Pointer;
      Len: Integer);
      var
      FichTest: TextFile;
      Str:string;
    begin
      AssignFile(FichTest, 'c:\TestGet.txt');
      Append(FichTest);
      SetLength(str, HttpCli1.RcvdStream.size);//init string à la taille du stream
      HttpCli1.RcvdStream.position := 0;
      HttpCli1.RcvdStream.Read(str[1], len);
      ShowMessage(str);
      writeln(FichTest,Str);
      CloseFile(FichTest);
    end;
     
    end.
    J'aimerais également savoir me servir du Buffer transmis en paramètre, ca pourrait être pratique non? Mais c'est un pointeur, et j'avoue ne pas avoir trouvé d'exemple concret pour utiliser ce Buffer correctement.

    Merci !
    à mon avis ton Stream ne sert à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      SetString(Str, PChar(Buffer), Len);

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    à mon avis ton Stream ne sert à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      SetString(Str, PChar(Buffer), Len);
    Pourquoi faire simple... Merci

    J'ai modifié en PAnsiChar et je suis bon, j'ai mes caractères en clair!

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

Discussions similaires

  1. Flux XML et affichage via XSL sans extension XSL ?
    Par manuef515 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/12/2008, 23h28
  2. Réponses: 3
    Dernier message: 10/04/2007, 19h57
  3. Comment indenter un flux XML avant affichage ?
    Par danyboy85 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/12/2006, 11h30
  4. probleme lors de l'analyse d'un flux xml sous asp
    Par jlassira dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/07/2005, 14h01

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