ear*_*arl 11
在写这篇文章(2013-01)的时候,雷博尔3仍然缺乏将其用雷博尔2.捆绑但是,如果你是罚款黑客找到了丢失的CGI支持自己为数不多的CGI-支持功能,您仍然可以在朝好的方向发展远.
在我们开始之前,您需要将R3二进制文件存储在要运行CGI的计算机上,并且您需要知道存储它的位置的完整路径(为简单起见).以下示例假设具有R3二进制文件的Unix风格的计算机/usr/local/bin/rebol3.
让我们从比您要求的更简单的事情开始: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!"
]
Run Code Online (Sandbox Code Playgroud)
这与您在R2中编写的内容完全相同.
转到更有趣的事情:按照您的要求阅读和解析HTML表单提交.
为此,我们需要了解有关CGI的两件事:提交的数据作为标准输入传递给CGI; 其他CGI特定信息通过环境变量从Web服务器传递.我们可以通过system/ports/input端口访问R3中的输入数据,并使用get-envnative 来读取环境变量.
让我们将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
Run Code Online (Sandbox Code Playgroud)
理解这个脚本的最后一部分是如何实际解析发送给CGI的HTML表单数据.Rebol 2有一个decode-cgi辅助功能,Rebol 3目前缺乏这个功能.
但是,对于基本表单,只需知道CGI数据是以一个编码方式发送的,该编码将字段与&字段的名称和值分开=; everthing是URL编码的.因此,如果我们提交上面嵌入的表格,其值为"查理",则CGI将field=Charlie作为输入接收.提交"Foo Bar"会发送"field = Foo%20Bar".因此,对于基本形式,如上所示,parse ... "&="(用于分割字段和字段名称和值)和dehex(用于解码URL编码)的组合就足够了.
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |