如何使用Rebol 3编写"Hello,World"CGI?

dt2*_*dt2 8 cgi rebol rebol3

让我们从一些简单的东西开始:一个带有一个可以回显的字段的表单.

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编码)的组合就足够了.

  • 我将我的WebForm解码器移植到R3:http://reb4.me/r/r3webform - (`load-webform`和`to-webform`).比`decode-cgi`更进一步,并将构建更深层次的数据结构,例如:`load-webform"aa = A&a.b = B"`. (4认同)