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

让我们从一些简单的东西开始:一个带有一个可以回显的字段的表单.
在撰写本文时(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服务器传递.我们可以通过系统/端口/输入端口访问R3中的输入数据,并使用get-env native读取环境变量.

让我们将HTML表单本身嵌入到CGI中,并在CGI中进行模式切换:如果没有提交数据,则显示HTML表单;如果提交了数据,则对其进行处理并显示适当的响应.我们可以通过编写一个通过HTTP方法POST提交数据的表单,然后在CGI中检查它是否通过HTTP方法GET(无数据)或POST(表单数据)调用.可以通过REQUEST_METHOD环境变量获得调用CGI脚本的方法.

尽管如此,这里是完整的脚本,没有进一步的说法:

#!/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 Bar”.因此,对于基本形式,如上所示,解析…“& =”(用于分割字段和字段名称和值)和dehex(用于解码URL编码)的组合就足够了.

相关文章
相关标签/搜索