如何写一个" Hello,World" CGI与Rebol 3?

时间:2013-01-02 14:15:53

标签: cgi rebol rebol3

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

1 个答案:

答案 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编码)的组合如上所示就足够了。