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