Ergänzung zum X11-Basic Benutzerhandbuch
Dieses Dokument ist nicht das Benutzerhandbuch zu X11-Basic. Dieses und die Befehlsreferenz finden Sie im englischen Benutzerhandbuch und in der Android-Direkthilfe.
(siehe auch: http://x11-basic.sourceforge.net/)
1. WEB Programmierung mit X11-Basic
In diesem Kapitel wird erläutert, wie Sie X11-Basic-Programme für WEB-Schnittstellen verwenden können. Insbesondere durch die Verwendung sogenannter CGI-Scripts.
1.1. Was ist CGI?
CGI steht für Common Gateway Interface — ein Begriff, den Sie nicht wirklich kennen müssen. Kurz gesagt definiert CGI, wie Webserver und Webbrowser Informationen aus HTML-Formularen auf Webseiten verarbeiten. Dies bedeutet, dass anstelle des WEB-Servers, der statische Webseiten an die Clients sendet, ein Programm, typischerweise ein CGI-Skript genannt, aufgerufen werden kann, um die Seite zu dem Zeitpunkt zu erzeugen, zu dem die Anfrage empfangen wurde. Diese CGI-Skripte ergreifen einige Maßnahmen und senden dann eine Ergebnisseite an den Webbrowser des Benutzers zurück. Die Ergebnisseite kann bei jeder Ausführung des Programms anders aussehen.
Und diese Programme können X11-Basic-Programme sein.
1.1.1. Konfiguration
-
Alle X11-Basic-Skripte müssen mit der folgenden Anweisung in der ersten Zeile beginnen:
#!/usr/bin/xbasic
Da Unix keine speziellen Dateiendungen für Programme hat, müssen Sie so dem Betriebsystem (Unix) mitteilen, dass es sich bei dieser Datei um ein X11-Basic-Programm handelt und dass es vom X11-Basic-Interpreter
xbasic
ausgeführt werden soll. Dies funktioniert genauso wie bei Shell-Skripten. Der X11-Basic Interpreterxbasic
befindet sich nach der Installation normalerweise im Verzeichnis/usr/bin
. Dies kann bei einigen Systemen aber auch anders sein. Wenn Sie nicht sicher sind, wo die ausführbare Dateixbasic
ist, geben Siewhich xbasic
in die Befehlszeile ein und es gibt Ihnen den Pfad zurück. -
Alle Skripte müssen als ausführbar markiert sein.
Ausführbare Dateien sind solche, die Maschinenanwewisungen oder Code für einen Interpreter wie
xbasic
enthalten. Um eine Datei als ausführbar zu markieren, müssen Sie die Dateiberechtigungen ändern. Dies geschieht mit dem folgenden Befehl (aus einem Terminalfenster):chmod 755 filename.bas
Die Nummer 755 ist die Dateizugriffsmaske. Die erste Ziffer ist Ihre Erlaubnis; es ist 7 für den vollen Zugriff. Die Einstellungen für andere sind 5 zum Lesen und Ausführen (aber nicht verändern).
-
Die allererste PRINT-Anweisung in einem X11-Basic CGI-Skript, das HTML zurückgibt, muß sein:
PRINT "Content-type: text/html"+CHR$(13) PRINT ""+CHR$(13) FLUSH
Wenn Ihr X11-Basic-Skript HTML-Daten zurückgibt, müssen Sie dies als erste PRINT-Anweisung haben, um dem Webserver mitzuteilen, dass es sich um eine HTML-Datei handelt. Es müssen zwei Zeilenendezeichen (CR + LF) verwendet werden (das erklärt das zusätzliche
CHR$(13)
), damit dies funktioniert. Die FLUSH-Anweisung stellt sicher, dass diese Anweisung an den Webserver gesendet wird. Danach kommt normalerweise einPRINT "<HTML><BODY>" .... und so weiter......
-
Beenden Sie das Programm unbedingt mit
QUIT
.Ansonsten bleibt das cgi-Programm als Zombie im Speicher des Servers.
-
Verwenden Sie immer die POST-Methode mit HTML-Formularen,
Es gibt zwei Möglichkeiten, um Informationen vom Client zurück zum Webserver zu bekommen. Die GET-Methode übernimmt alle Daten aus den Formularen und verknüpft sie mit dem Ende der URL. Diese Information wird dann als Umgebungsvariable
QUERY_STRING
an das CGI-Programm übergeben. Da die GET-Methode eine Beschränkung auf 1024 Zeichen hat, empfiehlt es sich, die POST-Methode zu verwenden. Diese nimmt die Daten und sendet sie zusammen mit der Anfrage an den Webserver, ohne dass der Benutzer die hässlichen Zeichenfolgen in der URL sieht. Diese Information wird an das CGI-Programm über die Standard-Eingabe übergeben, von dem das CGI-Programm leicht (mitLINEINPUT
) lesen kann. Stellen Sie sicher, dass Ihr HTML-Formular-TagMETHOD=POST
hat, um die POST-Methode zu verwenden (keine Anführungszeichen). -
HTML-Formulare müssen auf das auszuführende CGI-Skript verweisen.
In Ihrem FORM-Tag gibt es ein ACTION-Attribut. Dies ist wie das HREF-Attribut für einen Link. Es sollte die URL des CGI-Programms sein, an das die Formulardaten gesendet werden sollen. Normalerweise ist dies
ACTION="/cgi-bin/filename.bas"
. -
X11-Basic-CGI-Dateien müssen normalerweise im Verzeichnis
cgi-bin
Ihres Webservers abgelegt werden.Jeder Webserver hat ein Wurzel-Verzeichnis. Dies ist das höchste Verzeichnis, auf das Ihre HTML-Dateien zugreifen können. (Sie möchten nicht, dass Clients in der Lage sind, Ihr gesamtes System zu durchsuchen.). In diesem Verzeichnis befindet sich normalerweise ein weiteres namens
cgi-bin
, in dem alle CGI-Programme abgelegt werden. Nur dort dürfen sie gestartet werden. Einige Web-Service-Provider geben jedem Benutzer ein eigenes lokales cgi-Verzeichnis in seinem Home-Verzeichnis, in das sie ihre CGI-Skripte legen können. Wenn dies der Fall ist, verwenden Sie stattdessen also dieses Verzeichnis.
1.2. Wie CGI funktioniert
Wenn ein Benutzer einen Link zu einem Gateway-Skript ansurft, werden Daten an den Server gesendet. Der Server formatiert diese Daten in Umgebungsvariablen und prüft, ob zusätzliche Daten über den Standard-Eingabestream übermittelt wurden. Die Umgebungsvariablen können dann im CGI-Skript ausgewertet werden.
1.2.1. Environment Variables
Eingangsdaten für CGI-Skripte werden normalerweise in Umgebungsvariablen übergeben. Die Daten werden vom Browser übergeben, der die Seite angesurft hat.
Umgebungsvariablen unterscheiden zwischen Groß- und Kleinschreibung und werden normalerweise wie in diesem Abschnitt beschrieben verwendet. Einige häufig verwendetete standartisierte (und plattformunabhängige) Umgebungsvariablen sind in der folgenden Tabelle aufgeführt:
Variable |
Bedeutung |
|
Gibt die Authentifizierungsmethode an und wird verwendet, um den Zugriff eines Benutzers zu überprüfen. |
|
Länge der Datenzeichenfolge als numerischen Wert. |
|
Der MIME-Typ der Daten. |
|
Gibt an, welche Version des CGI-Standards der Server verwendet. |
|
Gibt die MIME-Typen an, die der Browser akzeptiert, wenn sie über den Server an das Gateway-Skript übergeben werden. |
|
Gibt den Typ des Browsers an, der zum Senden der Anfrage verwendet wurde. |
|
Identifiziert die zusätzlichen Informationen in der URL nach der Identifizierung des CGI-Skripts. |
|
Wird vom Server basierend auf der Variablen |
|
Anfragezeichenfolge (wenn die URL eine Anfragezeichenfolge enthält). |
|
Identifiziert die Internetprotokolladresse des Remotecomputers, der die Anforderung stellt. |
|
Name des Computers, der die Anforderung stellt. |
|
Machinenidentifikation des Computers, der die Anforderung stellt. |
|
Benutzername zur Authentifizierung des Benutzers |
|
Gibt die Methode an, mit der die Anforderung durchgeführt wurde. |
|
Identifiziert den virtuellen Pfad zum ausgeführten Skript. |
|
Identifiziert den Server anhand seines Hostnamens, Alias oder seiner IP-Adresse. |
|
Gibt die Portnummer an, an der der Server die Anforderung erhalten hat. |
|
Gibt das Protokoll der an den Server gesendeten Anforderung an. |
AUTH_TYPE
|
Die `AUTH_TYPE'-Variable ermöglicht die Zugriffssteuerung für geschützte Bereiche des Webservers und kann nur auf Servern verwendet werden, die die Benutzerauthentifizierung unterstützen. Wenn ein Bereich der Website Zugriffssteuerung hat, ist die 'AUTH_TYPE'-Variable auf einen Wert gesetzt, der das verwendete Authentifizierungsschema angibt. Z.B. "Basic". Mit diesem Mechanismus kann der Server Nutzernamen und Passwort abfragen und überprüfen.
Dazu legt der Server einen Wert für die Variable |
||||||||||||||||||||||||||||||||||||||||||||||||
CONTENT_LENGTH
|
Die |
||||||||||||||||||||||||||||||||||||||||||||||||
CONTENT_TYPE
|
Die Variable
MIME-Subtypen sind in drei Kategorien eingeteilt: primär, zusätzlich definiert und erweitert. Der primäre Subtyp ist der primäre Datentyp, der zur Verwendung als MIME-Inhaltstyp verwendet wird. Zusätzlich definierte Datentypen sind immer Subtypen, die offiziell als MIME-Inhaltstypen übernommen wurden. Erweiterte Datentypen sind experimentelle Subtypen, die nicht offiziell als MIME-Inhaltstypen übernommen wurden. Sie können erweiterte Subtypen leicht identifizieren, da sie mit dem Buchstaben x gefolgt von einem Bindestrich beginnen. Die folgende Tabelle listet häufige MIME-Typen und ihre Beschreibungen auf:
Beachten Sie, dass es noch mehr als die oben aufgeführten Typen gibt. Einige MIME-Inhaltstypen können mit zusätzlichen Parametern verwendet werden. Diese Inhaltstypen umfassen CONTENT_TYPE = text/plain; charset=iso-8859-1 Bei mehrteiligen Daten ist der Boundary-Parameter erforderlich, um die Grenzzeichenfolge anzugeben, die Nachrichtenteile trennt. Die Zeichenfolge darf 1 bis 70 Zeichen lang sein und beliebige Buchstaben, Ziffern und Leerzeichen sowie eine begrenzte Anzahl von Sonderzeichen enthalten, darf aber nicht mit einem Leerzeichen enden. Sie muss eindeutig sein und darf in den Teilen der Nachrich nicht vorkommen. So etwa sieht das dann aus: CONTENT_TYPE = multipart/mixed; boundary=boundary_string |
||||||||||||||||||||||||||||||||||||||||||||||||
GATEWAY_INTERFACE
|
Die Variable GATEWAY_INTERFACE = name/version Die Version der CGI-Spezifikation ist 1.1. Ein Server, der dieser Version entspricht, würde die GATEWAY_INTERFACE = CGI/1.1 |
||||||||||||||||||||||||||||||||||||||||||||||||
HTTP_ACCEPT
|
Die Variable |
||||||||||||||||||||||||||||||||||||||||||||||||
HTTP_USER_AGENT
|
Die Variable |
||||||||||||||||||||||||||||||||||||||||||||||||
PATH_INFO
|
Die |
||||||||||||||||||||||||||||||||||||||||||||||||
PATH_TRANSLATED
|
Server übersetzen die |
||||||||||||||||||||||||||||||||||||||||||||||||
QUERY_STRING
|
Die Variable URL:
/cgi-bin/doit.cgi?word1+word2+word3 Gleichheitszeichen trennen die von der Seite vorgegebenen Schlüsselwörter von den vom Benutzer eingegebenen Werten. Im folgenden Beispiel ist das Schlüsselwort "key" und der vom Benutzer eingegebene Wert "never": URL:
/cgi-bin/doit.cgi?response=never Und-Symbole ( URL:
/cgi-bin/doit.cgi?response=sometimes&reason=I+am+not+really+sure Schließlich wird das Prozentzeichen verwendet, um Sonderzeichen zu kennzeichnen. Dem Prozentzeichen folgt ein Escape-Code für ein Sonderzeichen, ausgedrückt als hexadezimaler Wert. So könnte die vorherige Abfragezeichenfolge mithilfe des Escape-Codes für ein Apostroph umgeschrieben werden: URL:
/cgi-bin/doit.cgi?response=sometimes&reason=I%27m+not+really+sure |
||||||||||||||||||||||||||||||||||||||||||||||||
REMOTE_ADDR
|
Die Variable |
||||||||||||||||||||||||||||||||||||||||||||||||
REMOTE_HOST
|
Die Variable |
||||||||||||||||||||||||||||||||||||||||||||||||
REMOTE_IDENT
|
Die |
||||||||||||||||||||||||||||||||||||||||||||||||
REMOTE_USER
|
Die |
||||||||||||||||||||||||||||||||||||||||||||||||
REQUEST_METHOD
|
Die Variable Die Methoden |
||||||||||||||||||||||||||||||||||||||||||||||||
SCRIPT_NAME
|
gibt den virtuellen Pfad zum ausgeführten Skript an. Diese Information ist nützlich, wenn das Skript ein HTML-Dokument generiert, das auf das Skript verweist. |
||||||||||||||||||||||||||||||||||||||||||||||||
SERVER_NAME
|
identifiziert den Server anhand seines Hostnamens, Alias oder seiner IP-Adresse. Diese Variable ist immer gesetzt. |
||||||||||||||||||||||||||||||||||||||||||||||||
SERVER_PORT
|
gibt die Portnummer an, auf der der Server die Anfrage erhalten hat. Diese Information kann bei Bedarf von der URL zum Skript interpretiert werden. Die meisten Server verwenden jedoch den Standardport 80 für HTTP-Anforderungen. |
||||||||||||||||||||||||||||||||||||||||||||||||
SERVER__PROTOCOL
|
identifiziert das Protokoll, das zum Senden der Anfrage verwendet wird. Der der Variablen zugewiesene Wert identifiziert den Namen und die Version des verwendeten Protokolls. Das Format ist "Name/Version", z.B. HTTP/1.0. |
1.2.2. CGI Standard Input
Die meisten Daten, die an einen Webserver gesendet werden, werden zum in Umgebungsvariablen gespeichert, aber nicht alle Eingaben passen in eine Umgebungsvariable. Wenn ein Benutzer Daten übermittelt, die von einem Gateway-Skript verarbeitet werden sollen, werden diese Daten als URL-codierte Suchzeichenfolge oder über den Standard-Eingabestream empfangen. Der Server weiß, wie diese Daten verarbeitet werden, da die Methode (POST oder GET in HTTP 1.0) zum Übermitteln der Daten verwendet wird.
Das Senden von Daten über die Standardeingabe ist der direkteste Weg zum Senden von Daten. Der Server teilt dem Gateway-Skript mit, wie viele Bytes aus der Standardeingabe gelesen werden sollen. Das Skript öffnet dann den Standard-Eingabestream und liest die angegebene Datenmenge. Lange URL-codierte Suchzeichenfolgen können abgeschnitten werden. Daten, die über den Standard-Eingabestream gesendet werden, bleiben immer vollständig erhalten, egal, wie lang. Folglich ist der Standard-Eingabestrom der bessere Weg, um Daten zu übergeben.
1.2.3. Welche CGI Eingabe-Daten-Methode soll man nutzen?
Sie können eine Methode für die Datenübermittlung angeben, wenn Sie Ihre
Web-Formulare erstellen. Es gibt zwei Eingabemethoden für Formulare. Die
HTTP-GET-Methode verwendet URL-codierte Suchzeichenfolgen. Wenn ein
Server eine URL-codierte Suchzeichenfolge erhält, weist der Server den
Wert der Suchzeichenfolge der Variable QUERY_STRING
zu.
Die HTTP-POST-Methode verwendet die Standard-Eingabeströme. Wenn ein
Server Daten über den Standard-Eingabestream empfängt, ordnet der Server
der Variablen CONTENT_LENGTH
deren Länge in Bytes zu. Vom CGI-Script
aus können die Daten dann z.B. mit INPUT$()
gelesen werden.
Vielleicht möchten Sie einige der X11-Basic Beispielprogramme studieren, um die für Ihren Einsatzzweck geeignete Methode zu finden.
1.2.4. Die Ausgaben des CGI-Skripts
Nachdem das Skript die Eingabedaten gelesen und verarbeitet hat, sollte das Skript irgendeine Art von Ausgabe an den Server zurückgeben. Der Server wird dann die Ausgabe an den Client zurücksenden. Im Allgemeinen hat diese Ausgabe die Form einer HTTP-Antwort. Also eine Kopfzeile gefolgt von einer Leerzeile und dann gefolgt vom eigentlichen Textkörper, der dann den HTML-Code enthalten kann. Der Hauptteil kann beispielsweise ein HTML-Dokument enthalten, das der Client anzeigen soll.
1.2.5. CGI Kopfzeilen
CGI-Kopfzeilen (Header) enthalten Anweisungen für den Server. Derzeit sind diese drei Server-Direktiven gültig:
-
Content-Type
-
Location
-
Status
Ein einzelner Header kann eine oder alle Serverdirektiven enthalten. Ihr CGI-Skript gibt diese Anweisungen an den Server aus. Obwohl auf den Header eine Leerzeile folgt, die den Header vom Hauptteil trennt, muss die Ausgabe keinen Hauptteil enthalten.
Das Feld Content-Type in einem CGI-Header identifiziert den MIME-Typ der Daten, die Sie an den Client zurücksenden. Normalerweise ist die Datenausgabe eines Skripts ein vollständig formatiertes Dokument, z.B. ein HTML-Dokument. Sie könnten diese Ausgabe in der Kopfzeile wie folgt angeben:
Content-Type: text/html
Aber wenn Ihr Programm andere Daten wie Bilder etc. ausgibt, sollten Sie natürlich den entsprechenden Inhaltstyp angeben.
- Location
-
Die Ausgabe Ihres Skripts muss kein im Skript erstelltes Dokument sein. Sie können auf jedes Dokument im Web verweisen, indem Sie das Feld Location verwenden. Das Feld Location kann auf eine Datei verweisen, die anhand ihrer URL angegeben wird. Server verarbeiten diese Referenzen entweder direkt oder indirekt abhängig vom Speicherort der Datei. Wenn der Server die Datei lokal finden kann, übergibt er die Datei an den Client. Andernfalls leitet der Server die URL an den Client um, und der Client muss die Datei selbst abrufen. Sie können einen Speicherort in einem Skript wie folgt angeben:
Location: http://www.new-jokes.com/
- Status
-
Das Feld Status übergibt eine Statuszeile an den Server zur Weiterleitung an den Client. Statuscodes werden als dreistelliger Code gefolgt von einem String ausgedrückt, der allgemein erklärt, was passiert ist. Die erste Ziffer eines Statuscodes zeigt den allgemeinen Status wie folgt an:
1XX Not yet allocated 2XX Success 3XX Redirection 4XX Client error 5XX Server error
Obwohl viele Statuscodes von Servern verwendet werden, sind die Statuscodes, die Sie über Ihr CGI-Skript an einen Client übergeben, in der Regel Client-Fehlercodes. Angenommen, das Skript konnte keine Datei finden und Sie haben angegeben, dass das Skript in solchen Fällen einen Fehlercode ausgeben soll, anstatt nichts zurückzugeben. Hier ist eine Liste der Client-Fehlercodes, die Sie möglicherweise verwenden möchten:
401 Unauthorized Authentication has failed. Der Benutzer hat keine Zugriffsrechte auf diese Datei. Er muss sich Authentifizieren. 403 Forbidden. The request is not acceptable. Der Benutzer darf auf das File nicht zugreifen. 404 Not found. Die angegebene Datei oder Daten konnte nicht gefunden werden. 405 Method not allowed. Die Übertragungsmethode ist nicht erlaubt hier.
1.3. Ein Beispiel CGI Skript
Hier ist ein einfaches Beispiel-CGI-Skript, das einfach alle Informationen zurückgibt, die es vom Webserver als HTML-Seite erhält.
#!/usr/bin/xbasic PRINT "Content-type: text/html"+CHR$(13) PRINT ""+CHR$(13) FLUSH PRINT "<html><head><TITLE>Test CGI</TITLE><head><body>" PRINT "<h1>Commandline:</h1>" i=0 WHILE LEN(PARAM$(i)) PRINT STR$(i)+": "+PARAM$(i)+"<br>" INC i WEND PRINT "<h1>Environment:</h1><pre>" FLUSH ! flush the output before another program is executed ! SYSTEM "env" PRINT "</pre><h1>Stdin:</h1><pre>" length=VAL(ENV$("CONTENT_LENGTH")) IF length FOR i=0 TO length-1 t$=t$+CHR$(inp(-2)) NEXT i PRINT t$ ENDIF PRINT "</pre>" PRINT "<FORM METHOD=POST ACTION=/cgi-bin/envtest.cgi>" PRINT "Name: <INPUT NAME=name><BR>" PRINT "Email: <INPUT NAME=email><BR>" PRINT "<INPUT TYPE=submit VALUE="+CHR$(34)+"Test POST Method"+CHR$(34)+">" PRINT "</FORM>" PRINT "<hr><h6>(c) Markus Hoffmann cgi with X11-basic</h6></body></html>" FLUSH QUIT
2. Danksagung
Teile dieses Kapitels stammen aus oder basieren auf einer Dokumentation, die in den 1990er Jahren verwendet wurde. (Ich hoffe, es war Public Domain oder ähnliches.) Leider habe ich den Link verloren zu seiner Quelle. Wenn Sie Ihre potentielle Quelle kennen, lassen Sie es mich wissen. Dann kann ich es hier zitieren und dem Autor danken.