8

簡単なことから始めましょう。エコーされるフィールドを持つフォームです。

4

1 に答える 1

11

この記事の執筆時点(2013-01)では、Rebol3にはまだRebol2にバンドルされているいくつかのCGIサポート機能がありません。ただし、不足しているCGIサポートを自分でハックすることに問題がなければ、問題なく動作することができます。あちらへ。

始める前に、CGIを実行するマシンにR3バイナリを保存する必要があります。また、保存した場所へのフルパスを知っている必要があります(簡単にするため)。次の例では、に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!"
]

これは、R2で作成するものと同じです。

もう少し興味深いことに進みましょう。要求に応じて、HTMLフォームの送信を読み取って解析します。

このためには、CGIについて2つのことを知る必要があります。送信されたデータは標準入力として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このためのヘルパー機能がありましたが、Rebol3には現在ありません。

&ただし、基本的な形式の場合、CGIデータは、フィールドをで区切り、フィールドの名前と値を=;で区切るエンコーディングで送信されることを知っていれば十分です。すべてがURLエンコードされています。したがって、上記に埋め込まれたフォームを「Charlie」の値で送信すると、CGIはfield=Charlie入力として受け取ります。「FooBar」を送信すると、「field = Foo%20Bar」が送信されます。したがって、基本的なフォームの場合、上記のようにparse ... "&="(フィールドとフィールド名および値を分割するため)とdehex(URLエンコードをデコードするため)の組み合わせで十分です。

于 2013-01-06T17:16:44.377 に答える