2013-01-02 14 views

Antwort

11

Zum Zeitpunkt des Schreibens (2013-01) fehlen Rebol 3 noch die wenigen CGI-unterstützenden Funktionen, die mit Rebol 2 gebündelt wurden. Wenn es Ihnen aber gut geht, die fehlende CGI-Unterstützung selbst zu hacken, können Sie geh doch gleich los.

Bevor Sie beginnen, müssen Sie die R3-Binärdatei auf der Maschine speichern, auf der Sie Ihr CGI ausführen möchten, und Sie müssen den vollständigen Pfad zu Ihrer Speicherstelle kennen (der Einfachheit halber). Die folgenden Beispiele nehmen eine Unix-artige Maschine mit der R3-Binärdatei in /usr/local/bin/rebol3 an.

Beginnen wir mit etwas noch einfacherem als Sie angefordert haben: ein CGI sendet nur ein "Hallo, Welt!" Seite:

#!/usr/local/bin/rebol3 -cs 
REBOL [] 
prin [ 
    "Content-type: text/html" crlf 
    crlf 
    <!doctype html> 
    <title> "Rebol 3 CGI Sample: Hello" </title> 
    "Hello, World!" 
] 

Dies ist identisch mit dem, was Sie in R2 schreiben würden.

Weiter zu etwas etwas interessanter: Lesen und Parsen einer HTML-Formularübergabe, wie Sie angefordert haben.

Dazu müssen wir zwei Dinge über CGI wissen: übergebene Daten werden als Standardeingabe an das CGI übergeben; Andere CGI-spezifische Informationen werden vom Webserver über Umgebungsvariablen übergeben. Wir können auf die Eingangsdaten in R3 über den Port system/ports/input zugreifen und Umgebungsvariablen mit dem get-env native lesen.

Lassen Sie uns das HTML-Formular selbst in das CGI einbetten und einen Moduswechsel innerhalb des CGI vornehmen: Wenn keine Daten eingereicht wurden, zeigen Sie das HTML-Formular an; Wenn Daten eingereicht wurden, verarbeiten Sie sie und zeigen Sie eine entsprechende Antwort an. Wir können dies tun, indem wir ein Formular schreiben, das Daten über die HTTP-Methode POST übermittelt und dann innerhalb des CGI überprüft, ob es über die HTTP-Methode GET (keine Daten) oder POST (Formulardaten) aufgerufen wurde. Die Methode, mit der ein CGI-Skript aufgerufen wurde, ist über die Umgebungsvariable REQUEST_METHOD verfügbar.

Mit all das gesagt, ist hier das vollständige Skript ohne weiteres:

#!/usr/local/bin/rebol3 -cs 
REBOL [] 

handle-get: function [] [ 
    prin [ 
     "Content-type: text/html" crlf 
     crlf 
     <!doctype html> 
     <title> "Rebol 3 CGI Sample: Form" </title> 
     <form method="POST"> 
      "Your name:" 
      <input type="text" name="field"> 
      <input type="submit"> 
     </form> 
    ] 
] 

handle-post: function [] [ 
    data: to string! read system/ports/input 
    fields: parse data "&=" 
    value: dehex select fields "field" 
    prin [ 
     "Content-type: text/html" crlf 
     crlf 
     <!doctype html> 
     <title> "Rebol 3 CGI Sample: Response" </title> 
     "Hello," (join value "!") 
    ] 
] 

main: does [ 
    switch get-env "REQUEST_METHOD" [ 
     "GET" [handle-get] 
     "POST" [handle-post] 
    ] 
] 

main 

Das letzte Stück dieses Skript zu verstehen ist, wie tatsächlich an das CGI gesendet HTML-Formulardaten analysieren. Rebol 2 hatte hierzu eine decode-cgi Hilfsfunktion, die Rebol 3 derzeit nicht hat.

Für grundlegende Formulare ist es jedoch ausreichend zu wissen, dass CGI-Daten in einer Codierung gesendet werden, die Felder mit & und den Namen und Wert des Feldes mit =; Alles ist URL-codiert. Wenn wir also das oben eingebettete Formular mit dem Wert "Charlie" einreichen, erhält das CGI als Eingabe field=Charlie. Das Senden von "Foo Bar" sendet "field = Foo% 20Bar". Also noch einmal: Für Basisformulare genügt die Kombination parse ... "&=" (zum Aufteilen von Feldern und Feldnamen und Werten) und dehex (zum Dekodieren der URL-Codierung) wie oben gezeigt.

+0

Großartig, danke. Umfasst alles, was ich wissen wollte :) – dt2

+4

Ich portierte meinen WebForm-Decoder nach R3: http://reb4.me/r/r3webform - ('load-webform' und' to-webform'). Geht etwas weiter als "decode-cgi" und baut tiefere Datenstrukturen auf, z. B .: "load-webform" a.a = A & a.b = B "'. – rgchris

+2

R3 Web Form de/decoder jetzt bei http://reb4.me/r3/altwebform – rgchris

Verwandte Themen