Programmation Web C++


Qu'est-ce que CGI ?

  • Common Gateway Interface (CGI) est un ensemble de normes qui définissent la manière dont les informations sont échangées entre les serveurs Web et les scripts clients.

  • La spécification CGI est actuellement maintenue par NCSA. NCSA définit CGI comme suit :

  • Common Gateway Interface (CGI) est une norme d'interface. pour connecter des programmes de passerelle externes à des serveurs d'informations (tels que des serveurs HTTP).

  • La version actuelle est CGI/1.1, et la version CGI/1.2 est en cours.

Navigation Web

Pour mieux comprendre le concept de CGI, cliquons sur un hyperlien, naviguons jusqu'à 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, qui est le nom du fichier.

  • Le serveur Web analysera l'URL et recherchera 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 mauvais fichier.

  • Le navigateur Web obtient la réponse du serveur Web et affiche le fichier ou le message d'erreur en fonction de la réponse reçue.

Cependant, le serveur HTTP construit de cette manière, chaque fois qu'un fichier du répertoire est demandé, ce que le serveur HTTP renvoie n'est pas le fichier, mais est exécuté sous la forme d'un program et renvoyez la sortie générée par l’exécution au navigateur pour affichage.

Common Gateway Interface (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.

Schéma d'architecture CGI

La figure suivante illustre l'architecture de CGI :

cgiarch.gif

Configuration du serveur Web

Avant d'effectuer la programmation CGI, veuillez effectuer assurez-vous que votre serveur Web prend en charge CGI et est configuré pour gérer les programmes CGI. Tous les programmes CGI exécutés par le serveur HTTP doivent se trouver dans le répertoire préconfiguré. Ce répertoire est appelé répertoire CGI et est classiquement nommé /var/www/cgi-bin. Bien qu'un fichier CGI soit un fichier exécutable C++, par convention son 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 les 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 s'exécuter avec succès, vous pouvez exécutez n'importe quel programme CGI, tel que Perl ou Shell, etc.

Le premier programme CGI

Veuillez consulter le programme C++ suivant :

#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 - 第一个 CGI 程序</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Compilez le code ci-dessus, nommez le fichier exécutable cplusplus.cgi et enregistrez ce fichier dans le répertoire /var/www/cgi-bin. Avant d'exécuter un programme CGI, veuillez utiliser la commande chmod 755 cplusplus.cgi UNIX pour modifier le mode de fichier afin de garantir que le fichier est exécutable. Accédez au fichier exécutable et vous verrez le résultat suivant :

Bonjour tout le monde ! Ceci est mon premier programme CGI

Le programme C++ ci-dessus est un programme simple qui met son La sortie est écrite sur le Fichier STDOUT, qui s'affiche à l'écran. Ici, il convient de noter que la première ligne affiche Content-type: text/htmlrnrn. Cette ligne est renvoyée au navigateur et précise le type de contenu à afficher sur la fenêtre du navigateur. Vous devez comprendre les concepts de base de CGI afin de pouvoir progresser vers l'écriture de programmes CGI plus complexes à l'aide de Python. Les programmes C++ CGI peuvent interagir avec n'importe quel autre système externe (tel qu'un SGBDR).

Informations d'en-tête HTTP

lineContent-type:text/htmlrnrn font partie des informations d'en-tête HTTP, qui sont envoyées au navigateur pour mieux comprendre le contenu de la page. La forme des informations d'en-tête HTTP est la suivante :

HTTP 字段名称: 字段内容
 
例如
Content-type: text/html\r\n\r\n

Il existe d'autres informations d'en-tête HTTP importantes, qui sont souvent utilisées dans votre programmation CGI.

头信息描述
Content-type:MIME 字符串,定义返回的文件格式。例如 Content-type:text/html。
Expires: Date信息变成无效的日期。浏览器使用它来判断一个页面何时需要刷新。一个有效的日期字符串的格式应为 01 Jan 1998 12:00:00 GMT。
Location: URL这个 URL 是指应该返回的 URL,而不是请求的 URL。你可以使用它来重定向一个请求到任意的文件。
Last-modified: Date资源的最后修改日期。
Content-length: N要返回的数据的长度,以字节为单位。浏览器使用这个值来表示一个文件的预计下载时间。
Set-Cookie: String通过 string 设置 cookie。

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 lors de l'écriture de programmes CGI.

变量名描述
CONTENT_TYPE内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。
CONTENT_LENGTH查询的信息长度。只对 POST 请求可用。
HTTP_COOKIE以键 & 值对的形式返回设置的 cookies。
HTTP_USER_AGENT用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。
PATH_INFOCGI 脚本的路径。
QUERY_STRING通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。
REMOTE_ADDR发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。
REMOTE_HOST发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。
REQUEST_METHOD用于发出请求的方法。最常见的方法是 GET 和 POST。
SCRIPT_FILENAMECGI 脚本的完整路径。
SCRIPT_NAMECGI 脚本的名称。
SERVER_NAME服务器的主机名或 IP 地址。
SERVER_SOFTWARE服务器上运行的软件的名称和版本。

Le programme CGI suivant répertorie 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 环境变量</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>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV[ i ].c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Bibliothèque C++ CGI

Dans un exemple réel, vous devrez effectuer de nombreuses opérations via un programme CGI. Il existe une bibliothèque CGI spécialement écrite pour les programmes C++. Nous pouvons télécharger cette bibliothèque CGI depuis ftp://ftp.gnu.org/gnu/cgicc/ et suivre les étapes ci-dessous 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. Vous pouvez cliquer sur Documentation C++ CGI Lib pour afficher la documentation de la bibliothèque appropriée.

Méthodes GET et POST

Vous avez peut-être rencontré une situation dans laquelle vous devez transmettre certaines informations du navigateur au serveur Web et enfin au programme CGI. Habituellement, le navigateur utilise deux méthodes pour transmettre ces informations au serveur Web, à savoir les méthodes GET et POST.

Utilisez la méthode GET pour transmettre des informations

La méthode GET envoie des informations utilisateur codées ajoutées à la demande de page. La page et les informations codées sont séparées par le caractère ?, comme indiqué ci-dessous :

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

La méthode GET est la méthode par défaut de transmission des informations du navigateur au serveur Web. Elle générera une chaîne A très longue. . N'utilisez pas la méthode GET lorsque vous transmettez un mot de passe ou d'autres informations sensibles au serveur. La méthode GET a une limite de taille et jusqu'à 1 024 caractères peuvent être transmis dans une chaîne de requête.

Lors de l'utilisation de la méthode GET, l'en-tête http QUERY_STRING est utilisé pour transmettre des informations, accessibles à l'aide de la variable d'environnement QUERY_STRING dans les programmes CGI.

Vous pouvez transmettre des informations en suivant l'URL avec une simple paire clé-valeur concaténée, ou en utilisant la méthode GET de la balise HTML <FORM>

Exemple d'URL simple : méthode Get

Ce qui suit est une URL simple qui utilise la méthode GET pour transmettre deux valeurs​​au programme hello_get.py.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

L'exemple suivant génère le cpp_get.cgi programme CGI pour traiter les informations fournies par le Web entrée du navigateur. Les informations transmises sont facilement accessibles en utilisant la bibliothèque C++ CGI :

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **fi << endl;  
   }else{
      cout << "No text entered for first name" << endl;  
   }
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Maintenant, compilez le programme ci-dessus comme suit :

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Générez cpp_get.cgi et placez-le dans le répertoire CGI et essayez de accédez-y en utilisant le lien suivant :

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Cela produira le résultat suivant :

名:ZARA 
姓:ALI

Exemple de formulaire simple : Méthode GET

Ce qui suit est un exemple simple utilisant un formulaire HTML et un bouton de soumission pour transmettre deux valeurs. Nous utiliserons le même script CGI cpp_get.cgi pour gérer l'entrée.

<form action="/cgi-bin/cpp_get.cgi" method="get">
名:<input type="text" name="first_name">  <br />
 
姓:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>

Ce qui suit est le résultat réel du formulaire ci-dessus, veuillez entrer le prénom et le nom, puis cliquez sur le bouton Soumettre pour voir les résultats.

Utilisez la méthode POST pour transmettre des informations

Un moyen plus fiable de transmettre des informations à un programme CGI est la méthode POST. Cette méthode regroupe 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 sous forme de message distinct. Ce message est transmis au script CGI en entrée standard.

Nous utilisons également le programme cpp_get.cgi pour gérer la méthode POST. Reprenons le même exemple et passons deux valeurs en utilisant un formulaire HTML et un bouton de soumission, sauf que cette fois au lieu d'utiliser la méthode GET, nous utilisons la méthode POST comme suit :

<form action="/cgi-bin/cpp_get.cgi" method="post">
名:<input type="text" name="first_name"><br />
姓:<input type="text" name="last_name" />
 
<input type="submit" value="提交" />
</form>

Au programme CGI Pass données de la case à cocher

Nous utilisons des cases à cocher lorsque plusieurs options doivent être sélectionnées.

L'exemple de code HTML suivant est un formulaire avec deux cases à cocher :

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

Le programme C++ suivant génère le script cpp_checkbox.cgi pour gérer les cases à cocher transmises par une entrée de navigateur Web donnée par la boîte.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Transmettre les données des boutons radio au programme CGI

Nous utilisons les boutons radio lorsqu'une seule option doit être sélectionnée.

L'exemple de code HTML suivant est un formulaire avec deux boutons radio :

<form action="/cgi-bin/cpp_radiobutton.cgi" 
         method="post" 
         target="_blank">
<input type="radio" name="subject" value="maths" 
                                    checked="checked"/> 数学 
<input type="radio" name="subject" value="physics" /> 物理
<input type="submit" value="选择学科" />
</form>

Le programme C++ suivant générera le script cpp_radiobutton.cgi, qui est utilisé pour gérer la sélection radio par le navigateur Web L'entrée donnée par le bouton.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递单选按钮数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Transmettre les données de la zone de texte au programme CGI

Lorsque nous devons transmettre plusieurs lignes de texte au programme CGI, nous utilisons l'élément TEXTAREA.

L'exemple de code HTML suivant est un formulaire avec une zone TEXTAREA :

<form action="/cgi-bin/cpp_textarea.cgi" 
         method="post" 
         target="_blank">
<textarea name="textcontent" cols="40" rows="4">
请在这里输入文本...
</textarea>
<input type="submit" value="提交" />
</form>

Le programme C++ suivant générera le script cpp_textarea.cgi pour traiter la zone de texte saisie par le navigateur Web.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递文本区域数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   }else{
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Transmission des données de la liste déroulante au programme CGI

Nous utilisons des listes déroulantes lorsque plusieurs options sont disponibles mais qu'une ou deux options seulement peuvent être sélectionnées.

L'exemple de code HTML suivant est un formulaire avec une liste déroulante :

<form action="/cgi-bin/cpp_dropdown.cgi" 
                       method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>数学</option>
<option value="Physics">物理</option>
</select>
<input type="submit" value="提交"/>
</form>

Le programme C++ suivant générera le script cpp_dropdown.cgi, qui est utilisé pour traiter les informations fournies par le navigateur Web via la liste déroulante, entrez.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递下拉框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Utilisation de 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 met fin à son inscription après avoir effectué plusieurs pages d'étapes. Mais comment conserver les informations de session de l'utilisateur 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 de l'utilisateur, les achats, les commissions et d'autres informations nécessaires à la recherche d'une meilleure expérience de visiteur ou de statistiques sur le site.

Comment ça marche

Le serveur envoie certaines données au navigateur du visiteur sous la forme d'un cookie. Si le navigateur accepte le cookie, celui-ci est stocké sous forme d'enregistrement en texte brut sur le disque dur du visiteur. Désormais, 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 est stocké.

Un cookie est un enregistrement de données en texte brut avec 5 champs de longueur variable :

  • Expire : La date d'expiration du cookie. Si ce champ reste vide, le cookie expirera lorsque le visiteur quittera le navigateur.

  • Domaine : Le nom de domaine du site Web.

  • Chemin : Le chemin d'accès au répertoire ou à la page Web où le cookie est défini. Ce champ peut être laissé vide si vous souhaitez récupérer les cookies de n'importe quel répertoire ou page Web.

  • Sécurisé : Si ce champ contient le mot « sécurisé », alors 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 la forme de paires clé-valeur.

Définir des cookies

Envoyer des cookies à votre navigateur est très simple. Ces cookies sont envoyés avec l'en-tête HTTP avant le champ Type de contenu. Supposons que vous souhaitiez définir l'ID utilisateur et le mot de passe comme cookies, les étapes pour définir les cookies sont les suivantes :

#include <iostream>
using namespace std;

int main ()
{
 
   cout << "Set-Cookie:UserID=XYZ;\r\n";
   cout << "Set-Cookie:Password=XYZ123;\r\n";
   cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n";
   cout << "Set-Cookie:Path=/perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "设置 cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

À partir de cet exemple, nous comprenons comment définir les cookies. Nous utilisons l'en-tête HTTP Set-Cookie pour définir les cookies.

Ici, certaines propriétés de configuration des cookies sont facultatives, telles que Expire, Domaine et Chemin. Il est à noter que les cookies sont définis avant d'envoyer la ligne "Content-type:text/htmlrnrn.

Compilez le programme ci-dessus, générez setcookies.cgi et essayez d'utiliser le lien suivant Définir des cookies. Il définit quatre cookies sur votre ordinateur :

/cgi-bin/setcookies.cgi

Obtenir les cookies

Récupérer tous les cookies définis Oui Très simple. dans la variable d'environnement CGI HTTP_COOKIE, et leur forme est la suivante :

key1=value1;key2=value2;key3=value3....

L'exemple suivant montre comment obtenir des cookies

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // 获取环境变量
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
        cci != env.getCookieList().end(); 
        ++cci )
   {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   cout << "</table><\n";
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Maintenant, compilez le programme ci-dessus, générez getcookies.cgi et essayez. pour obtenir tous les cookies disponibles sur votre ordinateur en utilisant le lien ci-dessous :

/cgi-bin/getcookies.cgi

Cela produira une liste montrant les quatre cookies définis ci-dessus dans cette section, ainsi que tous les autres cookies sur votre ordinateur :

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl

Exemple de téléchargement de fichier

Afin de télécharger un fichier, le formulaire HTML doit avoir l'attribut enctype défini sur multipart/form- data. La balise d'entrée avec le type de fichier 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. fichiers téléchargés sur notre serveur. Vous pouvez essayer le code ci-dessus sur votre propre serveur Voici le script pour gérer les téléchargements de fichiers

cpp_uploadfile.cpp

 :

<html>
<body>
   <form enctype="multipart/form-data" 
            action="/cgi-bin/cpp_uploadfile.cgi" 
            method="post">
   <p>文件:<input type="file" name="userfile" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>
Le. L'exemple ci-dessus écrit le contenu dans le flux

cout

, mais vous pouvez ouvrir le flux de fichiers et enregistrer le contenu du fichier téléchargé dans la cible dans un fichier à l'emplacement .