C++ Web-Programmierung
Was ist CGI?
- Das Common Gateway Interface (CGI) ist ein Standard, der definiert, wie Informationen zwischen Webservern und Client-Skripten ausgetauscht werden.
- Die CGI-Spezifikation wird derzeit von NCSA gepflegt, das CGI wie folgt definiert:
- Das Common Gateway Interface (CGI) ist ein Schnittstellenstandard, damit externe Gateway-Programme mit Informationsservern wie HTTP-Servern kommunizieren können.
- Die aktuelle Version ist CGI/1.1, und CGI/1.2 wird entwickelt.
Web-Browsing
Um das Konzept von CGI besser zu verstehen, klicken wir auf einen Hyperlink, rufen eine bestimmte Webseite oder URL auf und sehen, was passiert.
- Ihr Browser kontaktiert den HTTP-Webserver und fordert die URL an, das heißt den Dateinamen.
- Der Webserver parst die URL und sucht nach dem Dateinamen. Wenn die angeforderte Datei gefunden wird, sendet der Webserver die Datei an den Browser zurück; andernfalls sendet er eine Fehlermeldung, die angibt, dass Sie eine falsche Datei angefordert haben.
- Der Webbrowser empfängt die Antwort vom Webserver und zeigt die Datei oder Fehlermeldung basierend auf der empfangenen Antwort an.
Bei einem auf diese Weise aufgebauten HTTP-Server sendet der HTTP-Server jedoch, wann immer eine Datei in einem Verzeichnis angefordert wird, nicht die Datei selbst zurück, sondern führt sie als Programm aus und sendet die durch diese Ausführung erzeugte Ausgabe zur Anzeige an den Browser zurück.
Das Common Gateway Interface (CGI) ist ein Standardprotokoll, das Anwendungen (CGI-Programme oder CGI-Skripte genannt) ermöglicht, mit Webservern und Clients zu interagieren. Diese CGI-Programme können in Python, PERL, Shell, C oder C++ usw. geschrieben werden.
CGI-Architekturdiagramm
Das folgende Diagramm veranschaulicht die CGI-Architektur:
Webserver-Konfiguration
Bevor Sie mit der CGI-Programmierung beginnen, stellen Sie sicher, dass Ihr Webserver CGI unterstützt und so konfiguriert wurde, dass er CGI-Programme verarbeiten kann. Alle vom HTTP-Server ausgeführten CGI-Programme müssen in einem vorkonfigurierten Verzeichnis abgelegt werden. Dieses Verzeichnis wird CGI-Verzeichnis genannt und heißt üblicherweise /var/www/cgi-bin. Obwohl CGI-Dateien C++-Executables sind, ist ihre Dateiendung üblicherweise.cgi。
Standardmäßig ist der Apache-Webserver so konfiguriert, dass er CGI-Programme in /var/www/cgi-bin ausführt. Wenn Sie ein anderes Verzeichnis für die Ausführung von CGI-Skripten 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 gehen wir davon aus, dass der Webserver konfiguriert wurde und erfolgreich läuft, und dass Sie jedes CGI-Programm ausführen können, wie z. B. Perl oder Shell usw.
Erstes CGI-Programm
Bitte sehen Sie sich das folgende C++-Programm an:
Beispiel
Kompilieren Sie den obigen Code, benennen Sie die ausführbare Datei cplusplus.cgi und speichern Sie diese Datei im Verzeichnis /var/www/cgi-bin. Bevor Sie das CGI-Programm ausführen, verwenden Sie bittechmod 755 cplusplus.cgiVerwenden Sie einen UNIX-Befehl, um den Dateimodus zu ändern und sicherzustellen, dass die Datei ausführbar ist. Greifen Sie auf die ausführbare Datei zu, und Sie sehen die folgende Ausgabe:
Hallo Welt! Dies ist mein erstes CGI-Programm
Das obige C++-Programm ist ein einfaches Programm, das seine Ausgabe in die STDOUT-Datei schreibt, das heißt, sie auf dem Bildschirm anzeigt. Hier ist es erwähnenswert, dass die erste Zeile der AusgabeContent-type:text/html\r\n\r\nan den Browser zurückgesendet wird und den Inhaltstyp angibt, der im Browserfenster angezeigt werden soll. Sie müssen die grundlegenden Konzepte von CGI verstehen, um Python weiterhin zum Schreiben komplexerer CGI-Programme zu verwenden. C++-CGI-Programme können mit jedem anderen externen System (wie z. B. RDBMS) interagieren.
HTTP-Header-Informationen
ZeileContent-type:text/html\r\n\r\nSie ist Teil der HTTP-Header-Informationen, die an den Browser gesendet werden, damit dieser den Seiteninhalt besser versteht. Die HTTP-Header-Informationen haben das folgende Format:
HTTP 字段名称: 字段内容 例如 Content-type: text/html\r\n\r\n
Es gibt auch einige andere wichtige HTTP-Header, die in Ihrer CGI-Programmierung häufig verwendet werden.
| Header-Informationen | Beschreibung |
|---|---|
| Content-type: | MIME-String, definiert das Format der zurückgegebenen Datei. Zum Beispiel Content-type:text/html. |
| Expires: Datum | Das Datum, an dem die Information ungültig wird. Der Browser verwendet es, um zu bestimmen, wann eine Seite aktualisiert werden muss. Eine gültige Datumszeichenfolge sollte das Format 01 Jan 1998 12:00:00 GMT haben. |
| Location: URL | Diese URL bezieht sich auf die URL, die zurückgegeben werden soll, nicht auf die angeforderte URL. Sie können damit eine Anforderung auf eine beliebige Datei umleiten. |
| Last-modified: Datum | Das Datum der letzten Änderung der Ressource. |
| Content-length: N | Die Länge der zurückzugebenden Daten in Bytes. Der Browser verwendet diesen Wert, um die geschätzte Downloadzeit für eine Datei anzugeben. |
| Set-Cookie: String | DurchstringCookie setzen. |
CGI-Umgebungsvariablen
Alle CGI-Programme können auf die folgenden Umgebungsvariablen zugreifen. Diese Variablen spielen eine sehr wichtige Rolle beim Schreiben von CGI-Programmen.
| Variablenname | Beschreibung |
|---|---|
| CONTENT_TYPE | Der Datentyp des Inhalts. Wird verwendet, wenn der Client zusätzliche Inhalte an den Server sendet. Zum Beispiel Funktionen wie Dateiupload. |
| CONTENT_LENGTH | Die Länge der Abfrageinformationen. Nur bei POST-Anfragen verfügbar. |
| HTTP_COOKIE | Gibt die gesetzten Cookies in Form von Schlüssel-Wert-Paaren zurück. |
| HTTP_USER_AGENT | Das User-Agent-Request-Header-Feld liefert Informationen über die Anfrage des Benutzers, einschließlich Browsername, Version und anderer plattformspezifischer Zusatzinformationen. |
| PATH_INFO | Der Pfad des CGI-Skripts. |
| QUERY_STRING | Die URL-kodierten Informationen beim Senden einer Anfrage über die GET-Methode, die die Parameter nach dem Fragezeichen in der URL enthalten. |
| REMOTE_ADDR | Die IP-Adresse des entfernten Hosts, der die Anfrage stellt. Dies ist sehr nützlich für Protokollierung und Authentifizierung. |
| REMOTE_HOST | Der voll qualifizierte Name des Hosts, der die Anfrage stellt. Wenn diese Information nicht verfügbar ist, kann REMOTE_ADDR verwendet werden, um die IP-Adresse zu erhalten. |
| REQUEST_METHOD | Die Methode, mit der die Anfrage gestellt wird. Die gebräuchlichsten Methoden sind GET und POST. |
| SCRIPT_FILENAME | Der vollständige Pfad des CGI-Skripts. |
| SCRIPT_NAME | Der Name des CGI-Skripts. |
| SERVER_NAME | Der Hostname oder die IP-Adresse des Servers. |
| SERVER_SOFTWARE | Der Name und die Version der Software, die auf dem Server läuft. |
Das folgende CGI-Programm listet alle CGI-Variablen auf.
Beispiel
C++-CGI-Bibliothek
In realen Beispielen müssen Sie viele Operationen über das CGI-Programm ausführen. Hier ist eine CGI-Bibliothek, die speziell für C++-Programme geschrieben wurde und die wir vonftp://ftp.gnu.org/gnu/cgicc/ beziehen können.Laden Sie diese CGI-Bibliothek herunter und installieren Sie die Bibliothek gemäß den folgenden Schritten:

$ tar xzf cgicc-X.X.X.tar.gz $ cd cgicc-X.X.X/ $ ./configure --prefix=/usr $ make $ make install
Hinweis:Die Bibliotheken libcgicc.so und libcgicc.a werden in das Verzeichnis /usr/lib installiert; führen Sie den Kopierbefehl aus:
$ sudo cp /usr/lib/libcgicc.* /usr/lib64/Damit CGI-Programme die dynamische Linkbibliothek libcgicc.so automatisch finden können.
Sie können aufC++ CGI Lib-Dokumentationklicken, um die entsprechende Bibliotheksdokumentation einzusehen.
GET- und POST-Methoden
Sie sind möglicherweise auf Situationen gestoßen, in denen Sie einige Informationen vom Browser an den Webserver und dann an das CGI-Programm übergeben müssen. Normalerweise verwendet der Browser zwei Methoden, um diese Informationen an den Webserver zu übergeben: GET und POST.
Übergeben von Informationen mit der GET-Methode
Die GET-Methode hängt die codierten Benutzerinformationen an die Seitenanforderung an. Die Seite und die codierten Informationen werden durch das Zeichen ? getrennt, wie folgt:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
Die GET-Methode ist die Standardmethode zum Übergeben von Informationen vom Browser an den Webserver. Sie erzeugt eine lange Zeichenkette in der Adressleiste des Browsers. Wenn Sie Passwörter oder andere vertrauliche Informationen an den Server übergeben, verwenden Sie nicht die GET-Methode. Die GET-Methode hat eine Größenbeschränkung; in einer Anforderungszeichenfolge sind maximal 1024 Zeichen zulässig.
Bei Verwendung der GET-Methode werden Informationen über den HTTP-Header QUERY_STRING übergeben, auf den in CGI-Programmen über die Umgebungsvariable QUERY_STRING zugegriffen werden kann.
Sie können Informationen übergeben, indem Sie einfache verkettete Schlüssel-Wert-Paare an die URL anhängen oder indem Sie die GET-Methode des HTML-Tags <FORM> verwenden.
Einfaches URL-Beispiel: GET-Methode
Das folgende Beispiel übergibt zwei Werte mit der GET-Methode an das Programm cpp_get.cgi.
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Das folgende Beispiel generiertcpp_get.cgiDas CGI-Programm wird verwendet, um Eingaben vom Webbrowser zu verarbeiten. Durch die Verwendung der C++-CGI-Bibliothek kann auf die übergebenen Informationen leicht zugegriffen werden:
Beispiel
Kompilieren Sie nun das obige Programm wie folgt:
$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc
Generieren Sie cpp_get.cgi, platzieren Sie es im CGI-Verzeichnis und versuchen Sie, darauf mit dem folgenden Link zuzugreifen:
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Dies ergibt das folgende Ergebnis:
名:ZARA 姓:ALI
Einfaches Formularbeispiel: GET-Methode
Das Folgende ist ein einfaches Beispiel, das ein HTML-Formular und einen Submit-Button verwendet, um zwei Werte zu übergeben. Wir werden dasselbe CGI-Skript cpp_get.cgi verwenden, um die Eingabe zu verarbeiten.
Das Folgende ist die tatsächliche Ausgabe des obigen Formulars. Bitte geben Sie Ihren Vornamen und Nachnamen ein und klicken Sie dann auf die Schaltfläche „Absenden“, um das Ergebnis zu sehen.
Übergeben von Informationen mit der POST-Methode
Eine zuverlässigere Methode zum Übergeben von Informationen an CGI-Programme ist die POST-Methode. Diese Methode verpackt Informationen auf die gleiche Weise wie die GET-Methode, außer dass sie die Informationen nicht als Textzeichenfolge nach dem ? in der URL übergibt, sondern als separate Nachricht. Die Nachricht wird als Standardeingabe an das CGI-Skript übergeben.
Wir verwenden auch das Programm cpp_get.cgi, um die POST-Methode zu verarbeiten. Verwenden wir dasselbe Beispiel und übergeben zwei Werte mit einem HTML-Formular und einer Schaltfläche „Absenden“, außer dass wir diesmal die POST-Methode anstelle der GET-Methode verwenden, wie folgt:
Übergeben von Checkbox-Daten an CGI-Programme
Wenn mehrere Optionen ausgewählt werden müssen, verwenden wir Checkboxen.
Das folgende HTML-Codebeispiel ist ein Formular mit zwei Kontrollkästchen:
Das folgende C++-Programm generiert das Skript cpp_checkbox.cgi, das die vom Webbrowser über Kontrollkästchen übermittelten Eingaben verarbeitet.
Beispiel
Übergeben von Radiobutton-Daten an CGI-Programme
Wenn nur eine Option ausgewählt werden muss, verwenden wir Radiobuttons.
Das folgende HTML-Codebeispiel ist ein Formular mit zwei Radio-Buttons:
Das folgende C++-Programm generiert das Skript cpp_radiobutton.cgi, das die vom Webbrowser über Radio-Buttons übermittelten Eingaben verarbeitet.
Beispiel
Übergeben von Textarea-Daten an CGI-Programme
Wenn mehrzeiliger Text an ein CGI-Programm übergeben werden muss, verwenden wir das TEXTAREA-Element.
Das folgende HTML-Codebeispiel ist ein Formular mit einem TEXTAREA-Feld:
Das folgende C++-Programm erzeugt das Skript cpp_textarea.cgi, das Eingaben verarbeitet, die vom Webbrowser über eine Textarea übergeben werden.
Beispiel
Übergeben von Dropdown-Box-Daten an CGI-Programme
Wenn mehrere Optionen verfügbar sind, aber nur eine oder zwei Optionen ausgewählt werden können, verwenden wir ein Dropdown-Feld.
Das folgende HTML-Codebeispiel ist ein Formular mit einem Dropdown-Feld:
Das folgende C++-Programm erzeugt das Skript cpp_dropdown.cgi, das die vom Webbrowser über ein Dropdown-Feld eingegebenen Daten verarbeitet.
Beispiel
Verwendung von Cookies in CGI
Das HTTP-Protokoll ist ein zustandsloses Protokoll. Aber für eine kommerzielle Website müssen Sitzungsinformationen zwischen verschiedenen Seiten beibehalten werden. Beispielsweise schließt ein Benutzer die Registrierung ab, nachdem er Schritte über mehrere Seiten hinweg ausgeführt hat. Wie können jedoch die Sitzungsinformationen des Benutzers über alle Webseiten hinweg beibehalten werden?
In vielen Fällen ist die Verwendung von Cookies die effektivste Möglichkeit, Informationen über Benutzerpräferenzen, Käufe, Provisionen und andere Informationen zu speichern und zu verfolgen, die für ein besseres Besuchererlebnis oder Website-Statistiken benötigt werden.
Funktionsweise
Der Server sendet einige Daten in Form eines Cookies an den Browser des Besuchers. Wenn der Browser das Cookie akzeptiert, wird es als Klartext-Datensatz auf der Festplatte des Besuchers gespeichert. Wenn der Besucher nun eine andere Seite der Website besucht, wird das Cookie abgerufen. Sobald das Cookie gefunden wurde, weiß der Server, was gespeichert wurde.
Ein Cookie ist ein Klartext-Datensatz mit 5 Feldern variabler Länge:
- Expires :Das Ablaufdatum des Cookies. Wenn dieses Feld leer bleibt, läuft das Cookie ab, wenn der Besucher den Browser verlässt.
- Domain :Der Domainname der Website.
- Path :Das Verzeichnis oder der Seitenpfad, in dem das Cookie gesetzt wird. Wenn Sie das Cookie von jedem Verzeichnis oder jeder Seite abrufen möchten, kann dieses Feld leer gelassen werden.
- Secure :Wenn dieses Feld das Wort "secure" enthält, kann das Cookie nur über einen sicheren Server abgerufen werden. Wenn dieses Feld leer bleibt, besteht diese Einschränkung nicht.
- Name=Value :Cookies werden in Form von Schlüssel-Wert-Paaren gesetzt und abgerufen.
Cookies setzen
Das Senden von Cookies an den Browser ist sehr einfach. Diese Cookies werden zusammen mit den HTTP-Headern gesendet, vor dem Content-type-Feld. Angenommen, Sie möchten UserID und Password als Cookies setzen. Die Schritte zum Setzen von Cookies sind wie folgt:
Beispiel
Aus diesem Beispiel haben wir gelernt, wie man Cookies setzt. Wir verwendenSet-CookieHTTP-Header, um Cookies zu setzen.
Hier sind einige Attribute zum Setzen von Cookies optional, wie Expires, Domain und Path. Es ist erwähnenswert, dass Cookies in der Sendzeile"Content-type:text/html\r\n\r\nEs wurde zuvor festgelegt.
Kompilieren Sie das obige Programm, um setcookies.cgi zu erzeugen, und versuchen Sie, den folgenden Link zu verwenden, um Cookies zu setzen. Es wird vier Cookies auf Ihrem Computer setzen:
/cgi-bin/setcookies.cgi
Cookies abrufen
Das Abrufen aller gesetzten Cookies ist sehr einfach. Die Cookies werden in der CGI-Umgebungsvariable HTTP_COOKIE gespeichert, und ihr Format ist wie folgt:
key1=value1;key2=value2;key3=value3....
Das folgende Beispiel zeigt, wie Cookies abgerufen werden.
Beispiel
Kompilieren Sie nun das obige Programm, um getcookies.cgi zu erzeugen, und versuchen Sie, den folgenden Link zu verwenden, um alle verfügbaren Cookies auf Ihrem Computer abzurufen:
/cgi-bin/getcookies.cgi
Dies erzeugt eine Liste, die die vier im vorherigen Abschnitt gesetzten Cookies sowie alle anderen Cookies auf Ihrem Computer anzeigt:
UserID XYZ Password XYZ123 Domain www.w3cschool.cc Path /perl
Beispiel für Datei-Upload
Um eine Datei hochzuladen, muss das HTML-Formular das enctype-Attribut aufmultipart/form-datasetzen. Das input-Tag mit dem Dateityp erstellt eine Schaltfläche "Durchsuchen".
Das Ergebnis dieses Codes ist das folgende Formular:
Hinweis:Das obige Beispiel hat das Speichern der hochgeladenen Datei auf unserem Server absichtlich deaktiviert. Sie können den obigen Code auf Ihrem eigenen Server ausprobieren.
Das Folgende ist ein Skript zur Verarbeitung von Datei-Uploads.cpp_uploadfile.cpp:
Beispiel
Das obige Beispiel ist incoutInhalt in den Stream schreiben, aber Sie können einen Dateistream öffnen und den Inhalt der hochgeladenen Datei in einer bestimmten Datei am Zielort speichern.
Weitere Erweiterungen