C++ Webprogrammierung
Was ist CGI?
-
Das Common Gateway Interface oder CGI ist eine Reihe von Standards, die definieren, wie Informationen zwischen dem Webserver und einem benutzerdefinierten Skript ausgetauscht werden.
-
Die CGI-Spezifikationen werden derzeit von der NCSA verwaltet und die NCSA definiert CGI wie folgt:−
-
Das Common Gateway Interface oder CGI ist ein Standard für externe Gateway-Programme, um mit Informationsservern wie HTTP-Servern zu kommunizieren.
-
Die aktuelle Version ist CGI/1.1 und CGI/1.2 ist in Bearbeitung.
Web-Browsing
Um das Konzept von CGI zu verstehen, sehen wir uns an, was passiert, wenn wir auf einen Hyperlink klicken, um eine bestimmte Webseite oder URL zu durchsuchen.
-
Ihr Browser kontaktiert den HTTP-Webserver und fordert die URL an, dh. Dateiname.
-
Der Webserver analysiert die URL und sucht nach dem Dateinamen. Wenn eine angeforderte Datei gefunden wird, sendet der Webserver diese Datei an den Browser zurück, andernfalls sendet er eine Fehlermeldung, die anzeigt, dass Sie eine falsche Datei angefordert haben.
-
Der Webbrowser nimmt die Antwort vom Webserver entgegen und zeigt basierend auf der empfangenen Antwort entweder die empfangene Datei oder eine Fehlermeldung an.
Es ist jedoch möglich, den HTTP-Server so einzurichten, dass immer dann, wenn eine Datei in einem bestimmten Verzeichnis angefordert wird, diese Datei nicht zurückgesendet wird; stattdessen wird es als Programm ausgeführt und die erzeugte Ausgabe des Programms wird zur Anzeige an Ihren Browser zurückgesendet.
Das Common Gateway Interface (CGI) ist ein Standardprotokoll, mit dem Anwendungen (CGI-Programme oder CGI-Skripte genannt) mit Webservern und Clients interagieren können. Diese CGI-Programme können in Python, PERL, Shell, C oder C++ usw. geschrieben sein.
CGI-Architekturdiagramm
Das folgende einfache Programm zeigt eine einfache Architektur von CGI −
Webserver-Konfiguration
Bevor Sie mit der CGI-Programmierung fortfahren, vergewissern Sie sich, dass Ihr Webserver CGI unterstützt und für die Verarbeitung von CGI-Programmen konfiguriert ist. Alle vom HTTP-Server auszuführenden CGI-Programme werden in einem vorkonfigurierten Verzeichnis gespeichert. Dieses Verzeichnis wird als CGI-Verzeichnis bezeichnet und gemäß Konvention als /var/www/cgi-bin bezeichnet. Konventionsgemäß haben CGI-Dateien die Erweiterung .cgi , obwohl sie in C++ ausführbar sind.
Standardmäßig ist Apache Web Server so konfiguriert, dass CGI-Programme in /var/www/cgi-bin ausgeführt werden. Wenn Sie ein anderes Verzeichnis zum Ausführen Ihrer CGI-Skripte angeben möchten, können Sie den folgenden Abschnitt in der Datei httpd.conf ändern −
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
Hier gehe ich davon aus, dass Sie den Webserver erfolgreich eingerichtet und ausgeführt haben und in der Lage sind, jedes andere CGI-Programm wie Perl oder Shell etc. auszuführen.
Erstes CGI-Programm
Betrachten Sie den folgenden Inhalt des C++-Programms −
#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; }
Kompilieren Sie den obigen Code und benennen Sie die ausführbare Datei als cplusplus.cgi. Diese Datei wird im Verzeichnis /var/www/cgi-bin gespeichert und hat folgenden Inhalt. Bevor Sie Ihr CGI-Programm ausführen, vergewissern Sie sich, dass Sie den Änderungsmodus der Datei mit chmod 755 cplusplus.cgi haben UNIX-Befehl, um die Datei ausführbar zu machen.
Mein erstes CGI-Programm
Das obige C++-Programm ist ein einfaches Programm, das seine Ausgabe in die STDOUT-Datei, d. h. den Bildschirm, schreibt. Es gibt eine wichtige und zusätzliche Funktion, nämlich das Drucken der ersten Zeile Content-type:text/html\r\n\r\n . Diese Zeile wird an den Browser zurückgesendet und gibt den Inhaltstyp an, der auf dem Browserbildschirm angezeigt werden soll. Jetzt müssen Sie das Grundkonzept von CGI verstanden haben und können viele komplizierte CGI-Programme mit Python schreiben. Ein C++-CGI-Programm kann mit jedem anderen externen System wie RDBMS interagieren, um Informationen auszutauschen.
HTTP-Header
Die Zeile Content-type:text/html\r\n\r\n ist ein Teil des HTTP-Headers, der an den Browser gesendet wird, um den Inhalt zu verstehen. Der gesamte HTTP-Header hat folgende Form:−
HTTP Field Name: Field Content For Example Content-type: text/html\r\n\r\n
Es gibt einige andere wichtige HTTP-Header, die Sie häufig in Ihrer CGI-Programmierung verwenden werden.
Sr.No | Kopfzeile &Beschreibung |
---|---|
1 | Inhaltstyp: Eine MIME-Zeichenfolge, die das Format der zurückgegebenen Datei definiert. Beispiel ist Content-type:text/html. |
2 | Läuft ab:Datum Das Datum, an dem die Informationen ungültig werden. Dies sollte vom Browser verwendet werden, um zu entscheiden, wann eine Seite aktualisiert werden muss. Eine gültige Datumszeichenfolge sollte das Format 01. Januar 1998 12:00:00 GMT haben. |
3 | Ort:URL Die URL, die anstelle der angeforderten URL zurückgegeben werden soll. Sie können dieses Feld verwenden, um eine Anfrage an eine beliebige Datei umzuleiten. |
4 | Zuletzt geändert:Datum Das Datum der letzten Änderung der Ressource. |
5 | Inhaltslänge:N Die Länge der zurückgegebenen Daten in Byte. Der Browser verwendet diesen Wert, um die geschätzte Downloadzeit für eine Datei zu melden. |
6 | Set-Cookie:String Setzt das Cookie, das durch den String geleitet wird . |
CGI-Umgebungsvariablen
Alle CGI-Programme haben Zugriff auf die folgenden Umgebungsvariablen. Diese Variablen spielen eine wichtige Rolle beim Schreiben von CGI-Programmen.
Sr.No | Variablenname und -beschreibung |
---|---|
1 | CONTENT_TYPE Der Datentyp des Inhalts, der verwendet wird, wenn der Client angehängte Inhalte an den Server sendet. Zum Beispiel Datei-Upload etc. |
2 | CONTENT_LENGTH Die Länge der Abfrageinformationen, die nur für POST-Anforderungen verfügbar sind. |
3 | HTTP_COOKIE Gibt die gesetzten Cookies in Form eines Schlüssel-Wert-Paares zurück. |
4 | HTTP_USER_AGENT Das User-Agent-Request-Header-Feld enthält Informationen über den User-Agent, von dem die Anfrage stammt. Es ist ein Name des Webbrowsers. |
5 | PATH_INFO Der Pfad für das CGI-Skript. |
6 | QUERY_STRING Die URL-codierten Informationen, die mit der GET-Methodenanforderung gesendet werden. |
7 | REMOTE_ADDR Die IP-Adresse des Remote-Hosts, der die Anfrage stellt. Dies kann für Protokollierungs- oder Authentifizierungszwecke nützlich sein. |
8 | REMOTE_HOST Der vollständig qualifizierte Name des Hosts, der die Anfrage stellt. Wenn diese Informationen nicht verfügbar sind, kann REMOTE_ADDR verwendet werden, um die IR-Adresse zu erhalten. |
9 | REQUEST_METHOD Die für die Anforderung verwendete Methode. Die gebräuchlichsten Methoden sind GET und POST. |
10 | SCRIPT_FILENAME Der vollständige Pfad zum CGI-Skript. |
11 | SCRIPT_NAME Der Name des CGI-Skripts. |
12 | SERVER_NAME Der Hostname oder die IP-Adresse des Servers. |
13 | SERVER_SOFTWARE Der Name und die Version der Software, die der Server ausführt. |
Hier ist ein kleines CGI-Programm, um alle CGI-Variablen aufzulisten.
#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; }
C++ CGI-Bibliothek
Für echte Beispiele müssten Sie viele Operationen von Ihrem CGI-Programm ausführen. Es gibt eine für C++ geschriebene CGI-Bibliothek, die Sie von ftp://ftp.gnu.org/gnu/cgicc/ herunterladen und den Schritten zur Installation der Bibliothek folgen können −
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
Sie können die zugehörige Dokumentation unter „C++ CGI Lib Documentation.
einsehenGET- und POST-Methoden
Sie müssen auf viele Situationen gestoßen sein, in denen Sie Informationen von Ihrem Browser an den Webserver und schließlich an Ihr CGI-Programm übergeben müssen. Am häufigsten verwendet der Browser zwei Methoden, um diese Informationen an den Webserver zu übergeben. Diese Methoden sind die GET-Methode und die POST-Methode.
Übergabe von Informationen mit der GET-Methode
Die GET-Methode sendet die codierten Benutzerinformationen an die Seitenanforderung angehängt. Die Seite und die verschlüsselten Informationen werden durch das ? getrennt. Zeichen wie folgt −
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
Die GET-Methode ist die Standardmethode, um Informationen vom Browser an den Webserver zu übergeben, und sie erzeugt eine lange Zeichenfolge, die im Feld „Location:“ Ihres Browsers angezeigt wird. Verwenden Sie niemals die GET-Methode, wenn Sie Passwörter oder andere vertrauliche Informationen an den Server weitergeben müssen. Die GET-Methode hat eine Größenbeschränkung und Sie können bis zu 1024 Zeichen in einer Anforderungszeichenfolge übergeben.
Bei Verwendung der GET-Methode werden Informationen über den HTTP-Header QUERY_STRING übergeben und sind in Ihrem CGI-Programm über die Umgebungsvariable QUERY_STRING zugänglich.
Sie können Informationen weitergeben, indem Sie einfach Schlüssel-Wert-Paare zusammen mit einer beliebigen URL verketten, oder Sie können HTML-
C Sprache