C++ Programmation web
Qu'est-ce que CGI ?
- La Common Gateway Interface (CGI) est une norme qui définit comment les informations sont échangées entre les serveurs web et les scripts clients.
- La spécification CGI est actuellement maintenue par NCSA, qui définit CGI comme suit :
- La Common Gateway Interface (CGI) est une norme d'interface permettant à des programmes de passerelle externes de s'interfacer avec des serveurs d'informations tels que les serveurs HTTP.
- La version actuelle est CGI/1.1, et CGI/1.2 est en cours de développement.
Navigation web
Pour mieux comprendre le concept de CGI, cliquons sur un lien hypertexte, parcourons une page web ou une URL spécifique, et voyons ce qui se passe.
- Votre navigateur contacte le serveur web HTTP et demande l'URL, c'est-à-dire le nom du fichier.
- Le serveur web analyse l'URL et recherche le nom du fichier. Si le fichier demandé est trouvé, le serveur web renvoie le fichier au navigateur ; sinon, il envoie un message d'erreur indiquant que vous avez demandé un fichier incorrect.
- Le navigateur web reçoit la réponse du serveur web et affiche le fichier ou le message d'erreur en fonction de la réponse reçue.
Cependant, avec un serveur HTTP construit de cette manière, chaque fois qu'un fichier d'un répertoire est demandé, le serveur HTTP ne renvoie pas le fichier lui-même, mais l'exécute comme un programme et renvoie la sortie produite par cette exécution au navigateur pour qu'il l'affiche.
L'interface de passerelle commune (CGI) est un protocole standard qui permet aux applications (appelées programmes CGI ou scripts CGI) d'interagir avec les serveurs Web et les clients. Ces programmes CGI peuvent être écrits en Python, PERL, Shell, C ou C++, etc.
Diagramme de l'architecture CGI
Le diagramme suivant illustre l'architecture CGI :
Configuration du serveur Web
Avant de programmer en CGI, assurez-vous que votre serveur Web prend en charge CGI et a été configuré pour gérer les programmes CGI. Tous les programmes CGI exécutés par le serveur HTTP doivent être placés dans un répertoire préconfiguré. Ce répertoire est appelé répertoire CGI et, par convention, est nommé /var/www/cgi-bin. Bien que les fichiers CGI soient des exécutables C++, par convention leur extension est.cgi。
Par défaut, le serveur Web Apache 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 des 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, nous supposons que le serveur Web a été configuré et peut fonctionner correctement, et que vous pouvez exécuter n'importe quel programme CGI, tel que Perl ou Shell, etc.
Premier programme CGI
Veuillez regarder le programme C++ suivant :
Exemple
Compilez le code ci-dessus, nommez l'exécutable cplusplus.cgi, et enregistrez ce fichier dans le répertoire /var/www/cgi-bin. Avant d'exécuter le programme CGI, veuillez utiliserchmod 755 cplusplus.cgiUtilisez une commande UNIX pour modifier le mode du fichier et vous assurer que le fichier est exécutable. Accédez au fichier exécutable et vous verrez la sortie suivante :
Hello World ! Ceci est mon premier programme CGI
Le programme C++ ci-dessus est un programme simple qui écrit sa sortie dans le fichier STDOUT, c'est-à-dire l'affiche à l'écran. Ici, il convient de noter que la première ligne de sortieContent-type:text/html\r\n\r\nest renvoyée au navigateur et spécifie le type de contenu à afficher dans la fenêtre du navigateur. Vous devez comprendre les concepts de base de CGI afin d'utiliser ensuite Python pour écrire des programmes CGI plus complexes. Les programmes CGI C++ peuvent interagir avec tout autre système externe (tel qu'un SGBD).
Informations d'en-tête HTTP
ligneContent-type:text/html\r\n\r\nCela fait partie des informations d'en-tête HTTP, qui sont envoyées au navigateur pour mieux comprendre le contenu de la page. Les informations d'en-tête HTTP ont le format suivant :
HTTP 字段名称: 字段内容 例如 Content-type: text/html\r\n\r\n
Il existe également d'autres en-têtes HTTP importants, qui sont fréquemment utilisés dans votre programmation CGI.
| Informations d'en-tête | Description |
|---|---|
| Content-type: | Chaîne MIME, définit le format du fichier renvoyé. Par exemple Content-type:text/html. |
| Expires: Date | La date à laquelle l'information devient invalide. Le navigateur l'utilise pour déterminer quand une page doit être actualisée. Une chaîne de date valide doit avoir le format 01 Jan 1998 12:00:00 GMT. |
| Location: URL | Cette URL fait référence à l'URL qui doit être renvoyée, et non à l'URL demandée. Vous pouvez l'utiliser pour rediriger une requête vers n'importe quel fichier. |
| Last-modified: Date | La date de dernière modification de la ressource. |
| Content-length: N | La longueur des données à renvoyer, en octets. Le navigateur utilise cette valeur pour indiquer le temps de téléchargement estimé d'un fichier. |
| Set-Cookie: Chaîne | Définit le cookie viachaîne. |
Variables d'environnement CGI
Tous les programmes CGI peuvent accéder aux variables d'environnement suivantes. Ces variables jouent un rôle très important dans l'écriture de programmes CGI.
| Nom de la variable | Description |
|---|---|
| CONTENT_TYPE | Le type de données du contenu. Utilisé lorsque le client envoie du contenu supplémentaire au serveur. Par exemple, des fonctionnalités telles que le téléversement de fichiers. |
| CONTENT_LENGTH | La longueur des informations de requête. Disponible uniquement pour les requêtes POST. |
| HTTP_COOKIE | Renvoie les cookies définis sous la forme de paires clé & valeur. |
| HTTP_USER_AGENT | Le champ d'en-tête de requête user agent fournit des informations sur la requête de l'utilisateur, y compris le nom du navigateur, la version et d'autres informations supplémentaires spécifiques à la plateforme. |
| PATH_INFO | Le chemin du script CGI. |
| QUERY_STRING | Les informations encodées en URL lors de l'envoi d'une requête via la méthode GET, contenant les paramètres après le point d'interrogation dans l'URL. |
| REMOTE_ADDR | L'adresse IP de l'hôte distant effectuant la requête. Elle est très utile pour la journalisation et l'authentification. |
| REMOTE_HOST | Le nom pleinement qualifié de l'hôte effectuant la requête. Si cette information n'est pas disponible, REMOTE_ADDR peut être utilisé pour obtenir l'adresse IP. |
| REQUEST_METHOD | La méthode utilisée pour effectuer la requête. Les méthodes les plus courantes sont GET et POST. |
| SCRIPT_FILENAME | Le chemin complet du script CGI. |
| SCRIPT_NAME | Le nom du script CGI. |
| SERVER_NAME | Le nom d'hôte ou l'adresse IP du serveur. |
| SERVER_SOFTWARE | Le nom et la version du logiciel exécuté sur le serveur. |
Le programme CGI suivant liste toutes les variables CGI.
Exemple
Bibliothèque CGI C++
Dans des exemples réels, vous devez effectuer de nombreuses opérations via le programme CGI. Voici une bibliothèque CGI écrite spécifiquement pour les programmes C++, que nous pouvons obtenir à partir deftp://ftp.gnu.org/gnu/cgicc/Téléchargez cette bibliothèque CGI et installez la bibliothèque en suivant les étapes suivantes :

$ tar xzf cgicc-X.X.X.tar.gz $ cd cgicc-X.X.X/ $ ./configure --prefix=/usr $ make $ make install
Remarque :Les bibliothèques libcgicc.so et libcgicc.a seront installées dans le répertoire /usr/lib ; exécutez la commande de copie :
$ sudo cp /usr/lib/libcgicc.* /usr/lib64/Afin que les programmes CGI puissent trouver automatiquement la bibliothèque de liens dynamiques libcgicc.so.
Vous pouvez cliquer surDocumentation de la bibliothèque CGI C++, consultez la documentation de la bibliothèque correspondante.
Méthodes GET et POST
Vous avez peut-être rencontré des situations où vous devez transmettre certaines informations du navigateur au serveur web, puis au programme CGI. Habituellement, le navigateur utilise deux méthodes pour transmettre ces informations au serveur web : GET et POST.
Transmission d'informations à l'aide de la méthode GET
La méthode GET ajoute les informations utilisateur encodées à la requête 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. Elle génère une longue chaîne dans la barre d'adresse du navigateur. Lorsque vous transmettez des mots de passe ou d'autres informations sensibles au serveur, n'utilisez pas la méthode GET. La méthode GET a une limite de taille, autorisant un maximum de 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, accessible dans les programmes CGI via la variable d'environnement QUERY_STRING.
Vous pouvez transmettre des informations en ajoutant des paires clé-valeur simples concaténées à l'URL, ou en utilisant la méthode GET de la balise HTML <FORM>.
Exemple d'URL simple : méthode GET
L'URL suivante est une URL simple qui transmet deux valeurs au programme cpp_get.cgi à l'aide de la méthode GET.
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
L'exemple suivant génèrecpp_get.cgiLe programme CGI est utilisé pour traiter l'entrée du navigateur web. En utilisant la bibliothèque CGI C++, les informations transmises peuvent être facilement accessibles :
Exemple
Maintenant, compilez le programme ci-dessus comme suit :
$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc
Générez cpp_get.cgi, placez-le dans le répertoire CGI et essayez d'y accéder avec le lien suivant :
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Cela produit le résultat suivant :
名:ZARA 姓:ALI
Exemple de formulaire simple : méthode GET
Ce qui suit est un exemple simple qui utilise un formulaire HTML et un bouton d'envoi pour transmettre deux valeurs. Nous utiliserons le même script CGI cpp_get.cgi pour traiter l'entrée.
Ce qui suit est la sortie réelle du formulaire ci-dessus. Veuillez saisir votre prénom et votre nom, puis cliquer sur le bouton d'envoi pour voir le résultat.
Transmission d'informations à l'aide de la méthode POST
Une méthode plus fiable pour transmettre des informations aux programmes CGI est la méthode POST. Cette méthode encapsule les informations de la même manière que la méthode GET, sauf qu'au lieu de transmettre les informations sous forme de chaîne de texte après le ? dans l'URL, elle les transmet comme un message séparé. Le message est transmis au script CGI en tant qu'entrée standard.
Nous utilisons également le programme cpp_get.cgi pour gérer la méthode POST. Utilisons le même exemple, en transmettant deux valeurs avec un formulaire HTML et un bouton d'envoi, sauf que cette fois nous utilisons la méthode POST au lieu de la méthode GET, comme suit :
Transmission de données de cases à cocher aux programmes CGI
Lorsque plusieurs options doivent être sélectionnées, nous utilisons des cases à cocher.
L'exemple de code HTML suivant est un formulaire avec deux cases à cocher :
Le programme C++ suivant génère le script cpp_checkbox.cgi, qui traite les entrées fournies par le navigateur web via des cases à cocher.
Exemple
Transmission des données des boutons radio aux programmes CGI
Lorsqu'une seule option doit être sélectionnée, on utilise des boutons radio.
L'exemple de code HTML suivant est un formulaire avec deux boutons radio :
Le programme C++ suivant génère le script cpp_radiobutton.cgi, qui traite les entrées fournies par le navigateur web via des boutons radio.
Exemple
Transmission des données Textarea aux programmes CGI
Lorsque du texte multiligne doit être transmis à un programme CGI, nous utilisons l'élément TEXTAREA.
L'exemple de code HTML suivant est un formulaire avec une zone TEXTAREA :
Le programme C++ suivant génère le script cpp_textarea.cgi, qui traite les entrées fournies par le navigateur web via une zone de texte.
Exemple
Transmission des données de liste déroulante aux programmes CGI
Lorsque plusieurs options sont disponibles mais que seulement une ou deux options peuvent être sélectionnées, nous utilisons une liste déroulante.
L'exemple de code HTML suivant est un formulaire avec une liste déroulante :
Le programme C++ suivant génère le script cpp_dropdown.cgi, qui traite les entrées fournies par le navigateur Web via une liste déroulante.
Exemple
Utilisation des cookies en CGI
Le protocole HTTP est un protocole sans état. Mais pour un site web commercial, il doit conserver les informations de session entre les différentes pages. Par exemple, un utilisateur termine son inscription après avoir effectué des étapes sur plusieurs pages. Cependant, comment les informations de session de l'utilisateur peuvent-elles être conservées sur toutes les pages web ?
Dans de nombreux cas, l'utilisation de cookies est le moyen le plus efficace de mémoriser et de suivre les informations sur les préférences des utilisateurs, les achats, les commissions et d'autres informations nécessaires à une meilleure expérience visiteur ou aux statistiques du site web.
Fonctionnement
Le serveur envoie certaines données au navigateur du visiteur sous la forme d'un cookie. Si le navigateur accepte le cookie, il est stocké sur le disque dur du visiteur sous forme d'enregistrement en texte brut. Maintenant, lorsque le visiteur visite une autre page du site web, le cookie est récupéré. Une fois le cookie trouvé, le serveur sait ce qui a été stocké.
Un cookie est un enregistrement de données en texte brut comportant 5 champs de longueur variable :
- Expires :La date d'expiration du cookie. Si ce champ est laissé vide, le cookie expirera lorsque le visiteur quittera le navigateur.
- Domain :Le nom de domaine du site web.
- Path :Le chemin du répertoire ou de la page où le cookie est défini. Si vous souhaitez récupérer le cookie depuis n'importe quel répertoire ou page, ce champ peut être laissé vide.
- Secure :Si ce champ contient le mot "secure", le cookie ne peut être récupéré que via un serveur sécurisé. Si ce champ est laissé vide, cette restriction n'existe pas.
- Name=Value :Les cookies sont définis et récupérés sous forme de paires clé-valeur.
Définir les cookies
L'envoi de cookies au navigateur est très simple. Ces cookies sont envoyés avec les en-têtes HTTP, avant le champ Content-type. Supposons que vous souhaitiez définir UserID et Password comme cookies. Les étapes pour définir des cookies sont les suivantes :
Exemple
À partir de cet exemple, nous avons appris comment définir des cookies. Nous utilisonsSet-Cookieles en-têtes HTTP pour définir des cookies.
Ici, certains attributs pour définir des cookies sont facultatifs, tels que Expires, Domain et Path. Il est à noter que les cookies se trouvent dans la ligne d'envoi"Content-type:text/html\r\n\r\nIl a été défini précédemment.
Compilez le programme ci-dessus pour générer setcookies.cgi, et essayez d'utiliser le lien suivant pour définir des cookies. Cela définira quatre cookies sur votre ordinateur :
/cgi-bin/setcookies.cgi
Obtenir les cookies
Récupérer tous les cookies définis est très simple. Les cookies sont stockés dans la variable d'environnement CGI HTTP_COOKIE, et leur format est le suivant :
key1=value1;key2=value2;key3=value3....
L'exemple suivant montre comment récupérer les cookies.
Exemple
Compilez maintenant le programme ci-dessus pour générer getcookies.cgi, puis essayez d'utiliser le lien suivant pour obtenir tous les cookies disponibles sur votre ordinateur :
/cgi-bin/getcookies.cgi
Cela produit une liste montrant les quatre cookies définis dans la section précédente ainsi que tous les autres cookies sur votre ordinateur :
UserID XYZ Password XYZ123 Domain www.w3cschool.cc Path /perl
Exemple de téléversement de fichier
Pour téléverser un fichier, le formulaire HTML doit définir l'attribut enctype àmultipart/form-data. La balise input avec le type file crée un bouton « Parcourir ».
Le résultat de ce code est le formulaire suivant :
Remarque :L'exemple ci-dessus a intentionnellement désactivé l'enregistrement du fichier téléversé sur notre serveur. Vous pouvez essayer le code ci-dessus sur votre propre serveur.
Voici un script pour gérer les téléversements de fichiers.cpp_uploadfile.cpp:
Exemple
L'exemple ci-dessus est encoutÉcrire le contenu dans le flux, mais vous pouvez ouvrir un flux de fichier et enregistrer le contenu du fichier téléversé dans un certain fichier à l'emplacement cible.
autres extensions