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

C++Builder Discussion :

Utilisation du TIdHTTPServer


Sujet :

C++Builder

  1. #1
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut Utilisation du TIdHTTPServer
    Bonjour,

    J'utilise actuellement un serveur Apache avec un CGI en C++ Borland qui ouvre une connection TCP / IP vers un autre logiciel C++ Builder qui génère des pages web et les renvoie au cgi qui renvoit vers le serveur apache.

    J'aimerai simplifier mon architecture et pour cela utiliser directement le composant TidHTTPServeur dispo sur le builder 2010 (et pouvoir ainsi virer le serveur Apache + cgi) :


    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "IdBaseComponent"
    #pragma link "IdComponent"
    #pragma link "IdCustomHTTPServer"
    #pragma link "IdCustomTCPServer"
    #pragma link "IdHTTPServer"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    IdHTTPServer1->Active=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::IdHTTPServer1Connect(TIdContext *AContext)
    {
    #ifdef _DELPHI_STRING_UNICODE
    Application->MessageBox(L"This should be on top.", L"Look", MB_OKCANCEL);
    #else
    Application->MessageBox("This should be on top.", "Look", MB_OKCANCEL);
    #endif

    }
    //---------------------------------------------------------------------------
    J'arrive à mettre le soft en écoute sur un port choisi, lorsque je tape http://127.0.0.1:8080 la messagebox s'affiche, mais j'aimerai maintenant pouvoir lire les trames envoyées par le navigateur web et lui renvoyer la page HTML.

    Est-ce que quelqu'un saurait faire ou aurait un lien vers une documentation ? Je n'ai pas réussi à trouver grand chose d'utile dans l'aide du builder malheureusement :/

    Merci d'avance pour vos réponses!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut j ai vu ta question et je m y suis mis vu que je vais devoir implementer quelque chose dans le genre dans une appli

    J ai juste traduit du code delphi mais vu que j y connais rien , çà m a pris pas mal de temps , au final c est instructif .

    donc voilà du prémaché


    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
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "SHDocVw_OCX"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int ok ;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    IdHTTPServer1->Active=true;        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::IdHTTPServer1CommandGet(TIdPeerThread *AThread,TIdHTTPRequestInfo *RequestInfo, TIdHTTPResponseInfo *ResponseInfo)
    {
    ok =0;
    TStringList *lst    = new TStringList();
    TStringList *lsttxt = new TStringList();
    lsttxt->LoadFromFile("MonHtmlReponse.htm");                           // on charge le fichier reponse
    AnsiString A_Remp = "MONTEXTE";
    TReplaceFlags Flags = Flags << rfReplaceAll << rfIgnoreCase ;         // fonction remplacer pour toutes les occurences sans prendre
                                                                          // en compte la casse
    if ( RequestInfo->Params->Count > 0 )                                 // Des parametres de passer ?
          { for ( int i = 0 ; i<= RequestInfo->Params->Count-1 ; i++ )    // -1 car la value du bouton est pris en compte
                  { lst->Add(RequestInfo->Params->Strings[i]);
     
                    for ( int i = 0 ; i<= lsttxt->Count-1 ; i++ ){        // debut de la detection de la frappe de l utilisateur
                              switch ( StrToIntDef(lst->Values["lecode"],0)  )
                                         {case 1: lsttxt->Strings[i]=StringReplace(lsttxt->Strings[i] ,A_Remp, "T''as saisi 1", Flags );ok=1;break;
                                          case 2: lsttxt->Strings[i]=StringReplace(lsttxt->Strings[i] ,A_Remp, "T''as saisi 2", Flags );ok=1;break;
                      }}}}
    if ( ok !=1 ) { lsttxt->Text = StringReplace(lsttxt->Text,A_Remp,"1 ou 2  !!!!", Flags ) ;   }
     
    ResponseInfo->ContentText = lsttxt->Text;                             // Le texte que l'on renvoye
    ResponseInfo->WriteContent();                                         // on envoye le code html au browser appelant ^^
    lst->Free();
    lsttxt->Free();
    }
    //---------------------------------------------------------------------------
     void __fastcall TForm1::FormCreate(TObject *Sender)
    {  IdHTTPServer1->Active=true;   }                                    // activer le serveur à la creation
    //---------------------------------------------------------------------------
    Envoi.htm
    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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Formulaire</title>
    </head>
     
    <body>
    <p align="center"><big><b><u>Formulaire de saisie standard </u></b></big></p>
     
    <form name="form1" method="Get" action="http://127.0.0.1:80">
      <fieldset id="info1">
        <legend>Test</legend>
        <table width="400"  border="0" align="left" cellpadding="0" cellspacing="0">
          <tr>
            <td width="30%" height="28">
              <div align="left">
                code (1 ou 2) :
              </div>
            </td>
            <td width="70%" height="28">
              <div align="left">
                <input name="lecode" type="text" id="lecode" value="">
              </div>
            </td>
          </tr>
        </table>
      </fieldset>
     
      <p align="center">
        <input type="submit" name="Button" value="Envoyer" onClick="this.disabled=false;">
      </p>
    </form>
    </body>
    </html>
    Reponse.htm
    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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Formulaire</title>
    </head>
     
    <body>
    <p align="center"><big><b><u>La reponse </u></b></big></p>
    <br>
    MONTEXTE
    <br>
    <br>
    lol
    <br>
    </body>
    </html>

  3. #3
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut
    Merci beaucoup Cedni !
    Content de voir au passage que je ne suis pas le seul à vouloir tenter de remplacer un serveur apache par un composant Borland ^^

    Histoire de me fixer les idées, je résume ( ça servira aussi à ceux qui voudraient faire la même chose ^^ )

    La fonction utile est la suivante :

    void __fastcall TForm1::IdHTTPServer1CommandGet(TIdPeerThread *AThread,TIdHTTPRequestInfo *RequestInfo, TIdHTTPResponseInfo *ResponseInfo)

    Les paramètres passés par le navigateur au serveur en méthode GET, sont stockés dans :

    RequestInfo->Params
    qui est aussi une TStringList à priori et donc on peut connaitre le nombre d'arguments passés par la commande :
    RequestInfo->Params->Count

    Pour retourner une page web au navigateur :

    ResponseInfo->ContentText = lsttxt->Text; // avec lsttxt un TStringList
    ResponseInfo->WriteContent(); // envoyer le code html au browser appelant

    Il reste à faire fonctionner en méthode POST, je vais tester ce soir je suppose que seul le contenu du TStringList d'entré change ?

    Par contre pour récupérer les cookies du navigateur distant, est-ce qu'il y a aussi une commande du même style ?

    [Edit : trouvé il s'agit du RequestInfo->Cookies

    le code pour utiliser, Memo2 étant un TMemo :

    int Nb_Cookies = RequestInfo->Cookies->Count;
    if (Nb_Cookies > 0)
    {
    for ( int i=0 ; i < Nb_Cookies; i++)
    {
    Memo2->Lines->Add(RequestInfo->Cookies->Items[i]->ID);
    Memo2->Lines->Add(RequestInfo->Cookies->Items[i]->CookieName);
    Memo2->Lines->Add(RequestInfo->Cookies->Items[i]->Value);
    }

    }
    ]

    [Edit : je marque en résolu puisque le sujet l'est en grande partie, je rouvrirai un sujet sur le point de la méthode post plus tard]

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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