Ausgehend von dieser Vorlesung werden wir in den Lernprozess der CGI-Programmierung einsteigen. Durch die bisherigen Vorlesungen beherrschen Sie die Grundkenntnisse der CGI-Programmierung. Jetzt können Sie sich hinsetzen und Ihr CGI-Programm schreiben!
3. CGI-Programmierung
1. Serverseitiger Anschluss (SSI) und Gateway
2. Gateway: Verbinden Sie andere Protokolle über WEB
Beim Schreiben von CGI-Programmen ist es am besten, die folgenden Anwendungsdesignpunkte zu befolgen:
(1) Stellen Sie eine Frage – das Problem, das Sie lösen möchten
(2) Entwurfsphase – Konzeption des Grundgerüsts und der Funktionen des CGI-Programms
(3) Codierungsphase – Ideen mit Taten umsetzen
(4) Programmtransplantation – tragbaren Code schreiben
(5) Streben Sie nach Exzellenz – bringen Sie das Programm auf ein höheres Niveau
1. Serverseitiger Anschluss (SSI) und Gateway
In diesem Abschnitt stellen wir den serverseitigen Anhang SSI (Server Side Include) und das Gateway vor. Streng genommen ist SSI kein Teil der CGI-Programmierung, aber SSI kann einige Aufgaben erledigen, die einfache CGI-Programme erledigen können, und manchmal ist SSI sogar die beste Wahl. Daher erfolgt hier eine kurze Einführung.
SSI definiert eine Reihe von Befehlen, die in HTML-Text eingebettet sind. Bevor der HTML-Text an den HTTP-Client gesendet wird, verarbeitet der WEB-Server diese SSI-Befehle vor und gibt den verarbeiteten HTML-Text an den Browser des HTTP-Clients aus.
Das Befehlsformat von SSI ist:
< !--# Befehlsparameter="Wert" -->
SSI-Befehle unterscheiden sich von Java oder JavaScript dadurch, dass sie auf der Serverseite und nicht auf der Clientseite verarbeitet werden. Dies ähnelt CGI-Programmen. Innerhalb des Funktionsumfangs von SSI sind die Vorteile natürlich dieselben wie bei CGI-Programmen. Es kann die Ressourcennutzung des Servers verbessern und jeder WEB-Browser auf dem Client kann HTML-Text durchsuchen, der SSI enthält.
Im Folgenden sind sechs häufig verwendete SSI-Befehle aufgeführt:
(1)Befehl einschließen
(2) Echobefehl
(3) Exec-Befehl
(4)config-Befehl
(5) fsize-Befehl
(6) Flashmod-Befehl
include-Befehl
Der einzige unterstützte Parameter ist file, der den Inhalt der durch den Dateiparameter angegebenen Datei in den aktuellen HTML-Text einfügt. Wenn Sie die Sprache C kennen, können Sie erkennen, dass sie dieselbe Funktion hat wie der Befehl „#include“ in der Sprache C. Beispielsweise gibt es zwei HTML-Texte: main.html und header.html. Verwenden Sie den Befehl include in main.html: main.html:
<html>
<tilte> Test Include SSI Command </ /title>
< !--#include file="header.html" -->
<Körper>
Der obige Header stammt aus header.html!
< /body>
< /html>
header.html:
< H1> Dies ist ein Titel in header.html < /H1>
(Allerdings scheint OmniHTTPD den Befehl include nicht zu unterstützen, :<!)
Echo-Befehl
Der einzige unterstützte Parameter ist var, der zum Anzeigen von vom Server bereitgestellten Variablen verwendet wird, zum Beispiel:
DOCUMENT_NAME: aktueller Dateiname
DOCUMENT_URL: Relativer Pfad zum SSI-Text
DATE_LOCAL: lokales Datum
DATE_GMT: GMT-Datum (Creenwich Standard Time).
LAST_MODIFIED: Das letzte Änderungsdatum der Datei, die diesen SSI-Befehl enthält
HTTP_USER_AGENT: Browsername.
Beispiel: main.shtml <html>
Dieses Dokument wurde zuletzt am < !--#echo var="LAST_MODIFIED"--> aktualisiert
< /html>
Wenn Sie main.shtml mit einem Browser öffnen, können Sie den Zeitpunkt der letzten Änderung sehen. (Es ist zu beachten, dass main.shtml im HtDocs-Verzeichnis von OmniHTTPD gespeichert werden muss und im Browser über die Adresse http://localhost/main.shtml aufgerufen werden kann.)
exec-Befehl
Die beiden Parameter sind cgi und cmd. Ersteres ruft eine ausführbare Datei auf, z. B. cgi="/cgi-bin/finger.cgi"; letzteres ruft einen Systembefehl auf, z. B. cmd="ls". Leider unterstützt OmniHTTPD diesen SSI-Befehl nicht (vielleicht tut dies die neueste Version jetzt).
config-Befehl
Dieser Befehl legt fest, wie der Server Dateien verarbeitet und Datumsangaben anzeigt. Es hat zwei Parameter:
(1) timefmt, bestimmt das Format für die Anzeige von Datumsangaben. Verwenden Sie man strftime unter UNIX, um verfügbare Werte abzufragen.
(2) sizefmt, bestimmt das Format zur Anzeige der Dateilänge. Der Wert ist Bytes oder Adresse. Dieser Befehl wird auch in OmniHTTPD nicht unterstützt.
fsize-Befehl
Dieser Befehl zeigt die Größe einer bestimmten Datei an. Der Parameter ist file und gibt den Pfad und Dateinamen der Datei an.
flashmod-Befehl
Dieser Befehl zeigt das letzte Änderungsdatum der angegebenen Datei an. Der Parameter ist file und gibt den Pfad und Dateinamen der Datei an.
2. Gateway: Verbinden Sie andere Protokolle über WEB
Das HTTP-Protokoll kann nicht auf alle Ressourcen im Internet zugreifen, wenn Sie auf andere Ressourcen als das HTTP-Protokoll zugreifen möchten (z. B. POP3 und SMTP zum Senden und Empfangen von E-Mails). Sie benötigen ein Gateway. Ein CGI-Programm ist eine gute Möglichkeit, ein Gateway zu implementieren.
Einige häufig verwendete Gateways werden in vielen UNIX-HTTP-Servern bereitgestellt, z. B. Finger, Wais, Archie usw. In OmniHTTPD werden diese Gateways jedoch nicht bereitgestellt. Aber wir können OmniHTTPD Gateway-Funktionalität hinzufügen, indem wir CGI-Programme schreiben.
Formulare und ihre Verarbeitung
HTML-Formulare sind Teil von WEB-Dokumenten und werden verwendet, um von Benutzern eingegebene Informationen an den Server zu übermitteln. Normalerweise werden diese Informationen an das CGI-Programm übergeben, das basierend auf den Eingabeinformationen eine Reihe von Vorgängen oder Datenverarbeitungen durchführt, dann ein HTML-Dokument generiert, das die Verarbeitungsergebnisse darstellt, und es an den Browser des Clients zurücksendet.
Es ist ersichtlich, dass der Schlüsselteil eines CGI-Programms darin besteht, Eingabedaten abzurufen und HTML-Dokumente zu generieren, während die Betriebs- und Datenverarbeitungsteile mit denen der meisten Anwendungen identisch sind. In dieser Vorlesung werde ich vorstellen, wie man in Perl und Delphi Daten abruft und HTML-Dokumente ausgibt.
Zuerst erstellen wir ein HTML-Dokument mit dem Namen Greeting.html:
Greeting.html-Datei (gespeichert im HtDocs-Verzeichnis von OmniHTTPD)
<html>
<Kopf>
<title>Dies ist eine Begrüßungsseite </title>
< h1> Begrüßung </ /h1>
<Körper>
<hr>
< form action="/cgi-bin/greeting.pl" method=POST>
< p> Ihr Vorname: < input type=text name="firstname" size=60 maxlength=80> < /p>
< p> Ihr Nachname: < input type=text name="lastname" size=60 maxlength=80> < /p>
<hr>
< p> < input type=submit value="Alle OK!"> < input type=reset value="Alles löschen"> </ /p>
< /form>
< /body>
< /html>
Hier ist das Perl-CGI-Programm Greeting.pl:
Greeting.pl-Datei (gespeichert im cgi-bin-Verzeichnis von OmniHTTPD) # Grüße!
erfordern „cgi-lib.pl“;
# ==================================
# Eingabewerte abrufen
&ReadParse(*input);
$mFirstName = $input{'firstname'};
$mLastName = $input{'lastname'};
# ==================================
# Führen Sie hier einige Operationen aus
$mFullName = "$mFirstName $mLastName";
# ==================================
# HTML-Dokument zur Ausgabe erstellen
PRint&PrintHeader;
print "< html>< head>< title> Grüße! </ /title>< /head> ";
print "< body> Hallo, < i>$mFullName< /i> ! ";
print „< hr> by Greeting.pl < /body>< /html>“;
# ==================================
# Alles erledigt!
Testen Sie das CGI-Programm, indem Sie http://localhost/greeting.html durchsuchen.
Im obigen Perl-Programm müssen Sie als CGI-Programm „cgi-lib.pl“ verwenden, um auf die Datei cgi-lib.pl zu verweisen. Diese Datei verfügt über viele Funktionen und Prozeduren für die CGI-Programmierung. require entspricht #include in C, es ist jedoch zu beachten, dass nach der require-Anweisung ein Semikolon stehen muss.
Der ReadParse-Prozess liest die vom HTML-Formular übermittelten Daten und der Parameter ist ein Array-Zeiger. Es ist zu beachten, dass in Perl Funktions- und Prozeduraufrufen ein &-Symbol vorangestellt werden muss.
mFirstName, mLastName und mFullName sind Variablen. In Perl muss Variablennamen ein $-Zeichen vorangestellt werden.
Der eigentliche Rückgabewert der PrintHeader-Funktion ist „Content-type: text/html“, was dem Browser mitteilt, dass es sich bei den folgenden Daten um ein HTML-Dokument handelt.
Das Generieren des HTML-Dokuments ist sehr einfach. Verwenden Sie einfach die print-Anweisung, um den Inhalt des HTML-Dokuments auszugeben. Wie wäre es damit? Kann man mit Perl CGI-Programme schreiben?
Als nächstes schreiben wir ein Delphi-Programm, um dieselbe Funktion auszuführen:
Schließen Sie zunächst alle Projekte in Delphi, wählen Sie das Menü „Datei/Neu“, wählen Sie im Dialogfeld den Anwendungstyp „Webserver“ aus und verwenden Sie die Option „CGI Standalone Executable“. Ein neues Projekt wird mit dem Namen „WebModule1“ im Hauptfenster angezeigt.
Doppelklicken Sie mit der Maus auf die Actions-Eigenschaft von WebModule1. Das Bearbeitungsfenster für die Actions-Eigenschaft wird angezeigt. Erstellen Sie im Fenster eine neue Aktion mit dem Namen WebActionItem1, setzen Sie deren Default-Eigenschaft auf True, doppelklicken Sie auf das OnAction-Ereignis in dessen Events und fügen Sie den folgenden Code hinzu:
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
mFirstName, mLastName, mFullName: string;
HtmlDoc: string;
beginnen
// Eingabewerte abrufen:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// Hier einige Operationen ausführen
mFullName := mFirstName + ' ' + mLastName;
// HTML-Dokument zur Ausgabe erstellen
HtmlDoc := '< html>< head>< title> Grüße </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> Hallo, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> by Greeting.cgi < /body>< /html>';
Response.Content := HtmlDoc;
Ende;
Speichern Sie die Unit dieses Projekts als cgimain.pas und das Projekt als Greeting.dpr. Kopieren Sie nach dem Kompilieren (mit Strg+F9) Greeting.exe in das cgi-bin-Verzeichnis von OmniHTTPD und benennen Sie es in Greeting.cgi um. Nehmen Sie gleichzeitig die folgenden Änderungen an der zuvor geschriebenen Greeting.html vor:
Ändern Sie < form action="/cgi-bin/greeting.pl" method=POST> in
< form action="/cgi-bin/greeting.cgi" method=POST>
Auf diese Weise können Sie in Delphi geschriebene CGI-Programme testen, indem Sie http://localhost/greeting.html durchsuchen.
Wie aus diesem Programm hervorgeht, tritt in Delphi das OnAction-Ereignis von WebActionItem ein, sobald das CGI-Programm eine Anfrage erhält. In diesem Fall erfolgen die Dateneingabe und die HTML-Dokumentgenerierung wie folgt:
Rufen Sie den Wert des Formularelements über Request.ContentFields.Values[Name des HTML-Formularelements] ab.
Generieren Sie HTML-Dokumente, indem Sie Response.Content einen Wert zuweisen.
Das Folgende ist der Inhalt der drei Dateien des Delphi-Programms: ------------------------------------ ---- -------------------
gruß.dpr:
Programmbegrüßung;
{$APPTYPE CONSOLE}
verwendet
HTTPApp,
CGIApp,
cgimain in 'cgimain.pas' {WebModule1: TWebModule};
{$E cgi}
{$R *.RES}
beginnen
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
Ende.
-------------------------------------------------- ----------
cgimain.pas:
Einheit cgimain;
Schnittstelle
verwendet Windows, Nachrichten, SysUtils, Klassen, HTTPApp;
Typ
TWebModule1 = Klasse(TWebModule)
procedure WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
WebModule1: TWebModule1;
Durchführung
{$R *.DFM}
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
mFirstName, mLastName, mFullName: string;
HtmlDoc: string;
beginnen
// Eingabewerte abrufen:
mFirstName := Request.ContentFields.Values['firstname'];
mLastName := Request.ContentFields.Values['lastname'];
// Hier einige Operationen ausführen
mFullName := mFirstName + ' ' + mLastName;
// HTML-Dokument zur Ausgabe erstellen
HtmlDoc := '< html>< head>< title> Grüße </ /title>< /head>';
HtmlDoc := HtmlDoc + '< body> Hallo, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> by Greeting.cgi < /body>< /html>';
Response.Content := HtmlDoc;
Ende;
Ende.
-------------------------------------------------- ----------
cgimain.dfm:
Objekt WebModule1: TWebModule1
OldCreateOrder = False
Aktionen = <
Artikel
Standard = Wahr
Name = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
Ende>
Links = 192
Oben = 107
Höhe = 150
Breite = 215
Ende