Beginnen wir mit etwas Einfachem: ein Formular mit einem Feld, das gechannelt wird.Wie schreibe ich ein "Hello, World" CGI mit Rebol 3?
Antwort
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.
Großartig, danke. Umfasst alles, was ich wissen wollte :) – dt2
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
R3 Web Form de/decoder jetzt bei http://reb4.me/r3/altwebform – rgchris
- 1. Scala auf .Net Hello World
- 2. "Hello World" der AWT-Bridge
- 3. Hello World verwaltete Erweiterung Beispiel funktioniert nicht auf Neo4j 3
- 4. Linking Boost-Python Hello World
- 5. JBoss Hello World appilcation nicht
- 6. Cross-Compiler für ARM Hello World
- 7. Größe einer Hello World Android App
- 8. "Hello World" zu twittern von .NET-Anwendung
- 9. Richtiges Skript für Hello World in Erlang?
- 10. Textfeld mit abgerundeten Ecken mit Rebol 2/Rebol 3?
- 11. Was ist ein gutes Mehrkern-64-Bit-Programm "Hello World"?
- 12. Node.js Fehler für Hello World Beispiel
- 13. "Hello World" funktioniert nicht für rabbitmq
- 14. Wann sollte ich String s = new String ("Hello World") verwenden?
- 15. "Hello World" -Beispiel für Slick 2.0 mit MySQL
- 16. Working Hello World WebRTC DataChannel Beispiele mit Signalisierung implementiert
- 17. Kann "Hello World" nicht mit Angular JS arbeiten
- 18. Wie kann dieser Code Hello World ohne irgendeine Druckanweisung drucken
- 19. Groovy: Was ist los mit diesem "Hello World" Programm?
- 20. Stuck bei "Hello World" mit IntelliJ IDEA 9.0.1 für Scala
- 21. Wie funktioniert Javas Hello World ohne eine Objektinstanz?
- 22. FireFox "XML Parsing Error" mit Hello World WebSite!
- 23. Wie schreibe ich auf Kanal 3?
- 24. Umhüllen geteilter Variablen mit Rebol 3 FFI
- 25. Wie kann ich eine Hello World App mit F # und WPF ohne XAML erstellen?
- 26. Simple Genetic Algorithm trifft lokales Optimum für "Hello World"
- 27. Mein Win32 C++ 'Hello World Programm' wird nicht kompiliert
- 28. Wie setze ich ein Ninja-Hello-Weltprojekt?
- 29. Boost Python Hello World-Beispiel funktioniert nicht in Python
- 30. In Flask, warum funktioniert diese Hello World App?
Haben Sie die Methode [wie für Rebol 2 beschrieben] (http://www.rebol.com/docs/apache-cgi.html) ausprobiert? Wenn ja, wo bist du dabei auf eine Wand gestoßen? – HostileFork