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

标签 cgi rebol rebol3

让我们从一些简单的事情开始:一个带有被回显的字段的表单。

最佳答案

在撰写本文时(2013-01),Rebol 3 仍然缺少与 Rebol 2 捆绑在一起的少数 CGI 支持功能。但是,如果您可以自己破解缺少的 CGI 支持,您仍然可以继续前进离开。

在我们开始之前,您需要将 R3 二进制文件存储在要运行 CGI 的机器上,并且您需要知道存储它的完整路径(为简单起见)。下面的例子假设一个 Unix 风格的机器在 /usr/local/bin/rebol3 中带有 R3 二进制文件。 .

让我们从更简单的事情开始 比你要求的:一个 CGI 只是发送一个“你好,世界!”页:

#!/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 的信息通过环境变量从网络服务器传递。我们可以通过 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 数据以一种用 & 分隔字段的编码发送就足够了。和字段的名称和值 = ;一切都是 URL 编码的。因此,如果我们提交上面嵌入的带有“Charlie”值的表单,CGI 将收到 field=Charlie作为输入。提交“Foo Bar”会发送“field=Foo%20Bar”。因此,再次:对于基本形式,parse ... "&=" 的组合(用于拆分字段和字段名称和值)和 dehex (用于解码 URL 编码)如上所示就足够了。

关于cgi - 如何使用 Rebol 3 编写 "Hello, World"CGI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14123618/

相关文章:

c - 信号 CGI 输出在程序退出前完成

linux - 如何在运行我的脚本之前 grep 值键?

multithreading - 我可以根据 ProcessID 和 ThreadID 创建唯一的文件名吗?

css - rebol parse 函数是否能够创建完全解析 css2/css3 的规则?

unicode - 如何像 Rebol 2 一样在 Rebol 3 字符串中使用 U+FFFF 以上的 Unicode 代码点?

module - 如何在模块内使用模块?

python - 如何在 Python 3 CGI 中打印 unicode 字符?

rebol - 如何使用 Rebol 在 block 内创建子 block

utf-8 - 使用 rebol 将编码 UTF8 更改为 UTF 8 BOM