Dialogue avec un CGI (ou comment lire une page dynamique)

Une fois les informations extraites, il reste à les envoyer sur le portable.

Le site ouèbe de SFR permet de le faire, mais contrairement à la page météo, l'accès se fait par un formulaire où l'on doit saisir le numéro de téléphone, le message,...
Ce formulaire appelle un programme CGI qui effectue l'envoi.

La méthode vue précédement ne convient pas car il faut passer des paramètres au programme CGI comme le fait le formulaire.

Pour voir comment marche le formulaire, soit vous analysez le code source et vous en déduisez les différents paramètres, soit vous utilisez un analyseur de protocole comme celui founit par WebÞing.
C'est la deuxième méthode que je vous propose :

(1) La méthode POST est utilisée il faudra l'indiquer lors de l'appel des MFC

(2) Nom de l'application faisant appel au CGI

(3) Formes des paramètres passés au CGI, ici de type url.

(4) Paramètres sous forme décomposée

Il ne reste plus qu'à recontistuer ces paramètres puis à les envoyer au programme CGI.

Voici le code :


      // ouverture de session comme avant
      CInternetSession session("SmsCenter");

      CHttpFile* file=NULL;  (1)

      // initialisation des paramètres  (2)
      CString strServer ("sfr.smartcode.fr");
      CString strHeaders (
         "Accept: text/*\r\nUser-Agent: SmsCenter\r\n \
          Content-Type: application/x-www-form-urlencoded\r\n");
      CString strObject ("/cgi-bin/SendSMS.exe");

      // dont les informations à faire passer
      CString strData;
      strData.Format(
            "Recipient=%s&JourDelivery=&DeferredDelivery=&MinuteDelivery=&ValidityPeriod=4 \
             &Content=%s&AnneeDelivery=&MoisDelivery=&HeureDelivery=",
            (LPCSTR)_tel,(LPCSTR)_msg
            );  (3)

      INTERNET_PORT port=INTERNET_DEFAULT_HTTP_PORT;
      CHttpConnection* server=NULL;
      try {
            // tentative de connexion
            server=session.GetHttpConnection(strServer,port);
            // préparation de l'appel, rien n'est envoyé
            file=server->OpenRequest(CHttpConnection::HTTP_VERB_POST,strObject);  (4)
      } catch (CInternetException* pEx) {
            // sglrupss, pb
            file=NULL;
            pEx->Delete();
      }
      if (server==NULL) return -1;

      if (file!=NULL) {
            // on continue à charger la bête
            file->AddRequestHeaders(strHeaders);

            // on envoie ce qu'on a préparé et les données
            file->SendRequest(NULL,0,(void *)(LPCTSTR)strData,strData.GetLength());

            // on lit comme dans le 1er exemple
            CString line;
            while (file->ReadString(line)) {
                  ...
            }

            file->Close();
            delete file;
      }
      result=-2;

      // on a plus de chose a nettoyer que la 1ere fois
      server->Close();
      delete server;

(1) On est obligé de descendre un peu plus bas dans la hierarchie des MFC pour avoir un certain controle sur ce qui est fait. CInternetFile était de trop haut niveau, on passe a un CHttpFile.

(2) Contrairement au 1er exemple, il faut décomposer l'adresse internet en morceaux.
Ici, il n'est pas nécessaire de préciser http:// car on utilise un CHttpFile explicite.

(3) Les paramètres à faire passer sont ajoutés à la chaine sous forme url.

(4) On indique que l'on veut une méthode POST.


Page mise à jour le 13 fév. 00
© Osele 2000