簡単なことから始めましょう。エコーされるフィールドを持つフォームです。
1 に答える
この記事の執筆時点(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エンコードをデコードするため)の組み合わせで十分です。