【问题标题】:How to write a "Hello, World" CGI with Rebol 3?如何使用 Rebol 3 编写“Hello, World”CGI?
【发布时间】:2012-12-16 21:54:20
【问题描述】:

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

【问题讨论】:

标签: cgi rebol rebol3


【解决方案1】:

在撰写本文时 (2013-01),Rebol 3 仍然缺少与 Rebol 2 捆绑的少数 CGI 支持功能。但是,如果您可以自己破解缺少的 CGI 支持,您仍然可以马上出发。

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

让我们从比您要求的更简单的事情开始:一个只发送“Hello, World!”的 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 native读取环境变量。

让我们将 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 数据以将字段分隔为 &amp; 和字段的名称和值分隔为 = 的编码发送就足够了;一切都是 URL 编码的。因此,如果我们提交上面嵌入的值为“Charlie”的表单,CGI 将接收field=Charlie 作为输入。提交“Foo Bar”会发送“field=Foo%20Bar”。因此,再次重申:对于基本表单,如上所示,parse ... "&amp;="(用于拆分字段和字段名称和值)和dehex(用于解码 URL 编码)的组合就足够了。

【讨论】:

  • 我将我的 WebForm 解码器移植到 R3:reb4.me/r/r3webform —(load-webformto-webform)。比decode-cgi 更进一步,并将构建更深层次的数据结构,例如:load-webform "a.a=A&amp;a.b=B"
  • 在ren-c中,就是#!/usr/local/bin/r3 -s
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 2010-11-04
  • 2023-02-07
  • 1970-01-01
  • 2013-01-24
  • 2014-06-22
相关资源
最近更新 更多