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 :

Eclaircissement pour un TIdHTTPServer (Indy 10.6) et Delphi (D10)


Sujet :

Web & réseau Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut Eclaircissement pour un TIdHTTPServer (Indy 10.6) et Delphi (D10)
    Bonjour,

    Etant TRES novice () dans le développement web, j'aimerai quelques lumières pour l'utilisation du composant tIdHttpServer de Indy v 10.6 et Delphi Seattle.

    1- Est-ce que le composant tIdHttpServer sur un tdatamodule permet de gérer, à lui seul, un programme web avec connexion de plusieurs clients (via IE ou google chrome) ?
    2- Comment ne pas mélanger les infos envoyés par les clients ?
    Exemple : une page web où l'on saisit un utilisateur et un mot de passe pour accéder à une base Firebird
    Comment faire en sorte de garder tout au long de la session du client n le code utilisateur et le mot de passe sans le confondre avec
    le code utilisateur et le mot de passe de l'utilisateur n+1 ?
    Faut-il les enregistrer dans des cookies ? si oui comment ?
    3- Est-il possible avec simplement les composants de Indy d'utiliser AJAX ?
    4- Enfin, je suppose que le programme ne pourra pas tourner sur un Linux à moins de le transposer sur le compilateur Lazarus ?

    Merci d'avance pour votre aide car je bute sur ce problème depuis 3 jours sans trouver de solutions. :-)

    Cordialement

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Je ne suis pas un grand connaisseur de ce composant mais je me lance

    Citation Envoyé par asenaici Voir le message
    1- Est-ce que le composant tIdHttpServer sur un tdatamodule permet de gérer, à lui seul, un programme web avec connexion de plusieurs clients (via IE ou google chrome) ?
    Oui, le composant est mutli-thread et permet les requêtes en parallèle.

    Citation Envoyé par asenaici Voir le message
    2- Comment ne pas mélanger les infos envoyés par les clients ?
    En activant le support des sessions (propriété SessionState). TIdHttpServer génère lui-même le cookie nécessaire.
    Mais c'est à toi de mettre en route toute la logique d'authentification et de gestion des utilisateurs. Remy Lebeau () donne un exemple complet de cette gestion.

    Citation Envoyé par asenaici Voir le message
    3- Est-il possible avec simplement les composants de Indy d'utiliser AJAX ?
    AJAX c'est côté client, le serveur lui ne faisant que répondre à des requêtes. A toi d'inclure dans tes pages les scripts nécessaires (à base de XMLHttpRequest).

    Citation Envoyé par asenaici Voir le message
    4- Enfin, je suppose que le programme ne pourra pas tourner sur un Linux à moins de le transposer sur le compilateur Lazarus ?
    Exact !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Merci infiniment pour votre réponse.

    J'espère avoir compris car ce n'est pas si simple.

    Pour le mutli-thread, je ne savais pas mais je pensais que c'est le développeur qui doit gérer cela : avec quelque chose du genre Tread.Create,etc....mais il n'y a rien de tout cela avec le TiDHTTPServer.
    Dans l'évènement Get du tIdHTTPServer, je ne comprends pas comment il ne se mélange pas les pinceaux. Je m'explique :
    Via une page HTML qui demande un login et un mot de passe, si 2 postes clients (sur google chrome par exemple), cliquent en même temps sur le bouton Connexion,
    comment garder tout au long de la session le login et le mot de passe pour accéder à des données d'une SGBD sans qu'il mélange les logins et mot de passes ?

    Pour l'AJAX, j'ai bien vu par ci et là que l'on devait utiliser un XMLHttpRequest, mais je n'arrive pas à trouver un exemple avec Delphi (ou lazarus). Je suppose qu'il faille
    développer un programme qui reçoit la requête et doit renvoyer le résultat au XMLHttpRequest ?
    Cela m'aiderait beaucoup si vous avez un cht'i exemple.

    Quoiqu'il en soit, je vous remercie encore pour votre aide.


    Cordialement :-)

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par asenaici Voir le message
    Pour le mutli-thread, je ne savais pas mais je pensais que c'est le développeur qui doit gérer cela : avec quelque chose du genre Tread.Create,etc....mais il n'y a rien de tout cela avec le TiDHTTPServer.
    C'est intégré dans le composant, tu n'as rien à faire, chaque requête tourne dans son propre thread.
    Il faut par contre en tenir compte et sécuriser/synchroniser les éventuelles accès aux données locales depuis l'événement OnCommandGet.

    Citation Envoyé par asenaici Voir le message
    Dans l'évènement Get du tIdHTTPServer, je ne comprends pas comment il ne se mélange pas les pinceaux.
    Tu n'as pas regardé l'exemple de Remy Lebeau

    Il dérive une classe de TIdHTTPSession (TMySession) pour y stocker ces infos.
    Un cookie les stocke sur le client et elles sont associées à chaque requête (automatique).
    Le serveur les récupère par TMySession(ARequestInfo.Session).

    Citation Envoyé par asenaici Voir le message
    Pour l'AJAX, j'ai bien vu par ci et là que l'on devait utiliser un XMLHttpRequest, mais je n'arrive pas à trouver un exemple avec Delphi (ou lazarus).
    Et tu n'en trouveras pas puisque c'est du javascript !

    Il faut bien comprendre que c'est à toi de générer la page HTML (ou un fragment de page pour AJAX) dans l'événement OnCommandGet.

    Un petit exemple (AJAX synchrone). Tape http://localhost:8888 dans ton navigateur.

    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdHTTPServer1.DefaultPort := 8888;
      IdHTTPServer1.Active      := TRUE;
    end;
     
    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      //Renvoie la page complète s'il n'y a pas de paramètre
      if ARequestInfo.Params.Count = 0 then
      begin
        AResponseInfo.ContentText := '<html>'
                                      +'<head>'
                                        +'<title>Mon test TIdHttpServer</title>'
                                      +'</head>'
     
                                      +'<body>'
                                        +'<script>'
                                          +'function DoSayHello() {'
                                            +'var HttpRequest = new XMLHttpRequest();'
                                            +'HttpRequest.open("GET", "/?sayhello", false);'
                                            +'HttpRequest.send(null);'
                                            +'document.getElementById(''hello_id'').innerHTML += HttpRequest.responseText +"<br>";'
                                          +'}'
                                        +'</script>'
     
                                        +'<input type="button" value="Say Hello" onclick="DoSayHello();" />'
                                        +'<p id="hello_id"></p>'
                                      +'</body>'
                                    +'</html>';
      end
     
      //Retourne "Hello world !" si le paramètre est correct (AJAX)
      else if SameText(ARequestInfo.Params[0], 'sayhello') then
        AResponseInfo.ContentText := 'Hello world !'
     
      //Sinon erreur
      else AResponseInfo.ContentText := 'Unknown command !';
    end;
    C'est la base. Après, c'est vers les forums HTML/javascript qu'il faudra te tourner

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Citation Envoyé par asenaici Voir le message
    4- Enfin, je suppose que le programme ne pourra pas tourner sur un Linux à moins de le transposer sur le compilateur Lazarus ?
    Exact !
    Enfin plus tout à fait. Ca devrait être possible depuis Tokyo sur serveur Linux 64 bits pour autant que tu disposes d'une version Delphi Entreprise (minimum).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    Vous avez raison, j'ai rapidement regardé l'exemple de Remy Lebeau : je vais mieux l'étudier.

    Bon ..ben...j'ai plus qu'à me mettre au travail dans le calme : les enfants au centre, ma femme chez sa mère, du thé et mes musiques classiques.

    MERCI ENCORE INFINIMENT POUR VOTRE AIDE. C'EST SUPER SYMPA.

    Très cordialement :-))

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Alors j'ai bien vu le source dans la discussion de Remy Lebeau mais quelques éléments restent très obscures pour moi :
    1) Dans l'exemple, on a les déclarations de variables suivantes :
    ServerMethod: TServerMethods;
    jsResult: TJSONData;

    Je n'arrive pas à trouver d'où viennent les variables (ou objets) TServerMethods et TJSONData : je ne sais pas de quelles unités ils sont issus

    2) J'ai recommencé par faire un petit très simple avec un tIdHTTPServer et j'ai mis dans les événements OnCreateSession et OnSessionStart un un point d'arrêt
    - AutoStartSession = True
    - KKeepAlive = True
    - SessionIdCookieName = IDHTTPSESSIONID -> par défaut
    - SessionState = true
    - SessionTimeOut = 0

    Quand je lance le programme avec débogage, il ne s'arrête jamais dans ces événements

    Pourriez-vous me faire la lumière sur ces 2 points .

    Merci d'avance

    Cordialement ;-)

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par asenaici Voir le message
    Je n'arrive pas à trouver d'où viennent les variables (ou objets) TServerMethods et TJSONData : je ne sais pas de quelles unités ils sont issus
    Le dialogue client/serveur est fait au standard JSON. C'est un choix du développeur et n'a pas grande importance.
    Idem pour TServerMethods, une rustine du développeur pour le contrôle d'authentification.

    Citation Envoyé par asenaici Voir le message
    Quand je lance le programme avec débogage, il ne s'arrête jamais dans ces événements
    Soit l'événement est vide et ignoré par le compilateur, soit l'activation des sessions est faite après l'activation du serveur (peut-être non supporté).

    Il faudrait voir l'ensemble du code...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Seul l'événement IdHTTPServer1Connect s'éxécute puisque le champ memo1 affiche le message
    Les autres événements ne s'activent pas.
    Les propriétés du tIdHTTPServer :
    DefaultPort = 8080
    AutoStartSession = True
    KeepAlive = True
    SessionState = True


    Ci-joint le code :
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdHTTPServer1.Active := True;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      IdHTTPServer1.Active := False;
    end;
     
    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      Memo1.Lines.Add(ARequestInfo.Document);
     
      if (ARequestInfo.Document = '/') or
         (UpperCase(ARequestInfo.Document) = '/INDEX') or
         (UpperCase(ARequestInfo.Document) = '/INDEX.HTML') then
      begin
        AResponseInfo.ContentText :=
                    '<form action="AfficheInfo" method="post>'
                   +'<div>'
                   +'  <label for="code">Nom :</label>'
                   +'  <input type="text" Name="Nom" autofocus/>'
                   +'  <button type="submit">Validation</button>'
                   +'</div>'
                   + '</form>';
      end else
      begin
        AResponseInfo.ContentText :=
                    '<p align="center">'
                   +'  <b><font color=red size=10>PAGE INCONNU</font></b>'
                   +'</p>';
      end;
    end;
     
    procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
    begin
      Memo1.Lines.Add('Ev. OnConnect : '+AContext.Connection.Socket.Binding.PeerIP);
    end;
     
    procedure TForm1.IdHTTPServer1CreateSession(ASender: TIdContext;
      var VHTTPSession: TIdHTTPSession);
    begin
      Memo1.Lines.Add('Ev. OnCreateSession : '+VHTTPSession.RemoteHost+' - '+VHTTPSession.SessionID+' - '+IntToStr(VHTTPSession.Content.Count));
    end;
     
    procedure TForm1.IdHTTPServer1SessionEnd(Sender: TIdHTTPSession);
    begin
      Memo1.Lines.Add('Ev. OnSessionEnd : '+Sender.RemoteHost+' - '+Sender.SessionID+' - '+IntToStr(Sender.Content.Count));
    end;
     
    procedure TForm1.IdHTTPServer1SessionStart(Sender: TIdHTTPSession);
    begin
      Memo1.Lines.Add('Ev. OnSessionStart : '+Sender.RemoteHost+' - '+Sender.SessionID+' - '+IntToStr(Sender.Content.Count));
    end;
    Merci d'avance pour votre aide

    Cordialement

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Mets une valeur dans SessionTimeOut, disons 10000.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    MERCI : Ca fonctionne à ma grande stupéfaction.
    Est-ce que cela signifie qu'avec 0, tout le système n'a pas le temps de percevoir qu'une session est activée ?

    Une dernière petite question :
    Si je souhaite me connecter à une base sql avec login et mot de passe saisi via une page html,
    comment différencier les personnes qui se connectent chacun de chez eux.
    Exemple :
    Une personne A se connecte et saisit un login et mot de passe : A et MDPA
    Une personne B se connecte et saisit un login et mot de passe : B et MDPB

    Comment faire en sortie que durant le parcours des pages, je sache que la personne A qui fait une demande
    et pas la personne B ?
    Est-ce avec SessionID que je pourrais distinguer les utilisateurs ?
    C'est-à-dire créer une liste des sessionID en sauvegardant le login et le mot de passe pour
    retrouver les infos dans l'événement IdHTTPServer1CommandGet(, est-ce bien cela qu'il faut faire ?


    DANS TOUS LES CAS, VOUS M'AVEZ AIDE TRES PRECIEUSEMENT.
    CE WEEK-END, JE VAIS ETUDIER VOTRE EXEMPLE SUR XMLHttpRequest()

    MER ENCORE.

    Cordialement :-))))))

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/11/2015, 17h16
  2. Aide pour une connexion à sql serveur 2005 via Delphi 7
    Par fabpan dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/11/2009, 20h52
  3. Aide pour une connexion à sql serveur 2005 via Delphi 7
    Par fabpan dans le forum Développement
    Réponses: 0
    Dernier message: 10/11/2009, 15h56
  4. Indy 10.5.5 + Delphi 2009 -> accents dans corps d'email.
    Par Lux interior dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 26/03/2009, 10h06
  5. Tests pour céer un setup d'une appli Delphi
    Par User dans le forum Delphi
    Réponses: 4
    Dernier message: 20/03/2007, 13h07

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