cgi-mainを使って書いたCGIスクリプトでパラメータを受け取ってみましょう。
cgi-mainの最初の引数となっている手続きには、「CGIパラメータのリスト」が引数として渡されます。
(cgi-main
(lambda (params)
...
))
上記の例では、lambdaで書かれた無名手続きの引数であるparamsから「CGIパラメータのリスト」を取り出せばよいのです。
「www.cgiライブラリを利用する」で書いたhello.cgiを改造して、params引数にどんなリストが渡されるのか確かめてみましょう。
#!/usr/local/bin/gosh
(use www.cgi)
(use text.html-lite)
(cgi-main
(lambda (params)
(list
(cgi-header)
(html-doctype)
(html:html
(html:body
(html:p (x->string params ))
)))))
変更したのは(x->string params )の箇所です。x->string手続きを使って、paramsをそのまま文字列に変換しています。
このCGIに次のパラメータを与えてアクセスしたとします。
&y=2007&m=1&d=30
CGIは結果として次の文字列を表示します。
((y 2007) (m 1) (d 30))
この結果から、パラメータのリストとは「“キーと値から成る(2要素の)リスト”のリスト」であることが分かります。
では、同じキーを複数与えたときはどうなるでしょうか?
例:
&y=2007&y=2008&y=2009
結果:
((y 2007 2008 2009))
では、キーだけを与えた場合は?
例:
&y
結果:
((y #t))
この結果から、要素数は2要素ではなく複数であることが分かります。上記を修正するなら、パラメータのリストとは、「“キーに続く1個以上の値からなるリスト”のリスト」ということになります。
cgi-get-parameter手続きでパラメータの値を得る
ある特定のキーに対応する値を得たいときどうすれば良いでしょうか?
www.cgiライブラリのcgi-get-parameter手続きを使うと特定のキーに対応する値を取得できます。
#!/usr/local/bin/gosh
(use www.cgi)
(use text.html-lite)
(cgi-main
(lambda (params)
(list
(cgi-header)
(html-doctype)
(html:html
(html:body
(html:p (cgi-get-parameter "y" params))
)))))
ここでは"y"のキーに対応する値を取得しています。
このCGIに次のパラメータを与えてアクセスしたとします。
&y=2007&m=1&d=30
結果として表示されるのは"y"のキーに対応した値だけです。
結果:
2007
cgi-get-parameterで取得できるのは一つの値だけです。
&y=2007&y=2008&y=2009
上記の例では同じキーで複数の値を渡していますが、結果として表示させるのは一つの値だけです。
結果:
2007
cgi-get-parameterにオプション引数として:list #tを与えると戻り値として常にリストが返ります。
#!/usr/local/bin/gosh
(use www.cgi)
(use text.html-lite)
(cgi-main
(lambda (params)
(list
(cgi-header)
(html-doctype)
(html:html
(html:body
(x->string (cgi-get-parameter "y" params :list #t))
)))))
例:
&y=2007&y=2008&y=2009
結果:
(2007 2008 2009)
例:
&y=2007
結果:
(2007)
パラメータの値を数値に変換する
CGIパラメータの値の型は文字列です。
&y=2007
上記のパラメータを与えられたとき、"y"のキーに対応する値は"2007"という文字列です。
cgi-get-parameterにオプション引数として:convertキーワードを与えるとパラメータの値を変換することができます。
例:
(cgi-get-parameter "y" params :convert x->integer)
この例ではx->integer手続きを使ってパラメータの値を整数値に変換しています。