让我们从一些简单的东西开始:一个带有一个可以回显的字段的表单。
答案 0 :(得分:11)
在撰写本文时(2013-01),Rebol 3仍然缺少与Rebol 2捆绑在一起的少数支持CGI的功能。但是,如果你自己很好地修复了丢失的CGI支持,你仍然可以立刻开始。
在我们开始之前,您需要将R3二进制文件存储在要运行CGI的计算机上,并且您需要知道存储它的位置的完整路径(为简单起见)。以下示例假定在/usr/local/bin/rebol3
中使用R3二进制文件的Unix风格的机器。
让我们开始比你要求的更简单:一个CGI只是发送一个“Hello,World!”页:
#!/usr/local/bin/rebol3 -cs
REBOL []
prin [
"Content-type: text/html" crlf
crlf
<!doctype html>
<title> "Rebol 3 CGI Sample: Hello" </title>
"Hello, World!"
]
这与您在R2中所写的相同。
继续更有趣的事情:按照您的要求阅读和解析HTML表单提交。
为此,我们需要了解有关CGI的两件事:提交的数据作为标准输入传递给CGI;其他CGI特定信息通过环境变量从Web服务器传递。我们可以通过system/ports/input
端口访问R3中的输入数据,并使用get-env
本机读取环境变量。
让我们将HTML表单本身嵌入到CGI中,并在CGI中进行模式切换:如果没有提交数据,则显示HTML表单;如果提交了数据,则对其进行处理并显示适当的响应。我们可以通过编写一个通过HTTP方法POST提交数据的表单,然后在CGI中检查它是否通过HTTP方法GET(无数据)或POST(表单数据)调用。调用CGI脚本的方法可通过REQUEST_METHOD
环境变量获得。
总而言之,这里是完整的剧本,没有进一步的麻烦:
#!/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
理解此脚本的最后一部分是如何实际解析发送到CGI的HTML表单数据。 Rebol 2有一个decode-cgi
辅助功能,Rebol 3目前缺乏这个功能。
但是,对于基本表单,只需知道CGI数据是以一个编码发送的,该编码用&
分隔字段,用=
分隔字段的名称和值; everthing是URL编码的。因此,如果我们提交上面嵌入的表格,其值为“Charlie”,则CGI将收到field=Charlie
作为输入。提交“Foo Bar”会发送“field = Foo%20Bar”。所以,再次:对于基本形式,parse ... "&="
(用于拆分字段和字段名称和值)和dehex
(用于解码URL编码)的组合如上所示就足够了。