Programmation Web C++
Qu'est-ce que CGI ?
-
L'interface de passerelle commune, ou CGI, est un ensemble de normes qui définissent la manière dont les informations sont échangées entre le serveur Web et un script personnalisé.
-
Les spécifications CGI sont actuellement maintenues par la NCSA et la NCSA définit CGI comme suit −
-
L'interface de passerelle commune, ou CGI, est une norme permettant aux programmes de passerelle externes de s'interfacer avec des serveurs d'informations tels que des serveurs HTTP.
-
La version actuelle est CGI/1.1 et CGI/1.2 est en cours.
Navigation Web
Pour comprendre le concept de CGI, voyons ce qui se passe lorsque nous cliquons sur un lien hypertexte pour parcourir une page Web ou une URL particulière.
-
Votre navigateur contacte le serveur Web HTTP et demande l'URL, c'est-à-dire. nom de fichier.
-
Web Server analysera l'URL et recherchera le nom du fichier. S'il trouve le fichier demandé, le serveur Web renvoie ce fichier au navigateur, sinon il envoie un message d'erreur indiquant que vous avez demandé un mauvais fichier.
-
Le navigateur Web prend la réponse du serveur Web et affiche soit le fichier reçu, soit le message d'erreur en fonction de la réponse reçue.
Cependant, il est possible de configurer le serveur HTTP de manière à ce que chaque fois qu'un fichier dans un certain répertoire est demandé, ce fichier ne soit pas renvoyé ; à la place, il est exécuté en tant que programme et la sortie produite par le programme est renvoyée à votre navigateur pour affichage.
L'interface de passerelle commune (CGI) est un protocole standard permettant aux applications (appelées programmes CGI ou scripts CGI) d'interagir avec les serveurs Web et avec les clients. Ces programmes CGI peuvent être écrits en Python, PERL, Shell, C ou C++ etc.
Schéma d'architecture CGI
Le programme simple suivant montre une architecture simple de CGI −
Configuration du serveur Web
Avant de procéder à la programmation CGI, assurez-vous que votre serveur Web prend en charge CGI et qu'il est configuré pour gérer les programmes CGI. Tous les programmes CGI à exécuter par le serveur HTTP sont conservés dans un répertoire préconfiguré. Ce répertoire est appelé répertoire CGI et par convention il est nommé comme /var/www/cgi-bin. Par convention, les fichiers CGI auront l'extension .cgi , bien qu'ils soient exécutables en C++.
Par défaut, Apache Web Server est configuré pour exécuter des programmes CGI dans /var/www/cgi-bin. Si vous souhaitez spécifier un autre répertoire pour exécuter vos scripts CGI, vous pouvez modifier la section suivante dans le fichier httpd.conf −
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
Ici, je suppose que votre serveur Web est opérationnel et que vous pouvez exécuter n'importe quel autre programme CGI comme Perl ou Shell, etc.
Premier programme CGI
Considérez le contenu suivant du programme C++ −
#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Hello World - First CGI Program</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! This is my first CGI program</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
Compilez le code ci-dessus et nommez l'exécutable comme cplusplus.cgi. Ce fichier est conservé dans le répertoire /var/www/cgi-bin et son contenu est le suivant. Avant d'exécuter votre programme CGI, assurez-vous d'avoir changé de mode de fichier en utilisant chmod 755 cplusplus.cgi Commande UNIX pour rendre le fichier exécutable.
Mon premier programme CGI
Le programme C++ ci-dessus est un programme simple qui écrit sa sortie sur le fichier STDOUT, c'est-à-dire l'écran. Il y a une fonctionnalité importante et supplémentaire disponible qui est l'impression de première ligne Content-type:text/html\r\n\r\n . Cette ligne est renvoyée au navigateur et spécifie le type de contenu à afficher sur l'écran du navigateur. Vous devez maintenant avoir compris le concept de base de CGI et vous pouvez écrire de nombreux programmes CGI complexes en utilisant Python. Un programme C++ CGI peut interagir avec n'importe quel autre système externe, tel qu'un SGBDR, pour échanger des informations.
En-tête HTTP
La ligne Content-type:text/html\r\n\r\n fait partie de l'en-tête HTTP, qui est envoyé au navigateur pour comprendre le contenu. Tout l'en-tête HTTP sera sous la forme suivante −
HTTP Field Name: Field Content For Example Content-type: text/html\r\n\r\n
Il existe peu d'autres en-têtes HTTP importants que vous utiliserez fréquemment dans votre programmation CGI.
Sr.No | En-tête et description |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 |
Variables d'environnement CGI
Tout le programme CGI aura accès aux variables d'environnement suivantes. Ces variables jouent un rôle important lors de l'écriture de tout programme CGI.
Sr.No | Nom et description de la variable |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 |
Voici un petit programme CGI pour lister toutes les variables CGI.
#include <iostream> #include <stdlib.h> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>CGI Environment Variables</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // attempt to retrieve value of environment variable char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ) { cout << value; } else { cout << "Environment variable does not exist."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
Bibliothèque CGI C++
Pour des exemples réels, vous auriez besoin de faire de nombreuses opérations par votre programme CGI. Il existe une bibliothèque CGI écrite pour le programme C++ que vous pouvez télécharger depuis ftp://ftp.gnu.org/gnu/cgicc/ et suivez les étapes pour installer la bibliothèque −
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
Vous pouvez consulter la documentation connexe disponible dans "C++ CGI Lib Documentation".
Méthodes GET et POST
Vous devez avoir rencontré de nombreuses situations où vous devez transmettre certaines informations de votre navigateur au serveur Web et, finalement, à votre programme CGI. Le plus souvent, le navigateur utilise deux méthodes pour transmettre ces informations au serveur Web. Ces méthodes sont la méthode GET et la méthode POST.
Transmettre des informations à l'aide de la méthode GET
La méthode GET envoie les informations utilisateur codées ajoutées à la demande de page. La page et les informations encodées sont séparées par le ? caractère comme suit −
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
La méthode GET est la méthode par défaut pour transmettre des informations du navigateur au serveur Web et elle produit une longue chaîne qui apparaît dans la zone Location:de votre navigateur. N'utilisez jamais la méthode GET si vous avez un mot de passe ou d'autres informations sensibles à transmettre au serveur. La méthode GET a une limite de taille et vous pouvez transmettre jusqu'à 1024 caractères dans une chaîne de requête.
Lorsque vous utilisez la méthode GET, les informations sont transmises à l'aide de l'en-tête http QUERY_STRING et seront accessibles dans votre programme CGI via la variable d'environnement QUERY_STRING.
Vous pouvez transmettre des informations en concaténant simplement des paires clé et valeur avec n'importe quelle URL ou vous pouvez utiliser des balises HTML
Langue C