Hatena::ブログ(Diary)

このブログは証明できない。

2009-07-31

[]HaskellでWebアプリを作ってみた Vol.1(ライブラリ使わない編)

2009年も残すところ5ヶ月となりました。2009年を悔いなく過ごすためには、やはりHaskellでWebアプリを作るしかありませんよね。今年のWeb流行語大賞は、「ヒウィッヒヒー」と「ハスケルハスケル!」で決まりです。さっそく、HaskellでWebアプリを作ってみましょう。


今日作ってみたカンジっぽいWebアプリ的なものは、名前っぽいものを入力すると、それを出力する的なカンジっぽいものです。基本の「き」ですね。気合いの「き」でもあります。

f:id:shunsuk:20090731194610p:image

f:id:shunsuk:20090731194604p:image


CでCGIを作ったことのあるなら、考え方は同じです。標準入出力でやりとりするイメージ。 getEnv "QUERY_STRING"でGETパラメータを取得して、putStrLnで出力します。コードを見た方が早いですね。


import System.Environment

inputForm :: String -> String
inputForm script = concat [
  "<form action=\"", script, "\" method=\"GET\">",
  "<p>Who are you?</p>",
  "<input type=\"text\" name=\"name\" />",
  "<input type=\"submit\" value=\"send\" />",
  "</form>"]

getName :: String -> String
getName q = drop 5 q

main = do 
  putStrLn "Content-type: text/html; charset = UTF-8\n"
  putStrLn "<html>"
  putStrLn "<head><title>Hello</title></head>"
  putStrLn "<body>"
  script <- getEnv "SCRIPT_NAME"
  query <- getEnv "QUERY_STRING"
  case query of
    "" -> putStrLn $ inputForm script
    _  -> putStrLn $ concat ["<h1>Hello, ", getName query, "!</h1>"]
  putStrLn "</body>"
  putStrLn "</html>"

ホントはGETパラメーターを解析してやる必要があるのですが、name=xxxxしか渡ってこない前提でズルしてます。これは単に私の力不足です。本当に、、申し訳なく思う!!


他の言語(LL含む)でも同じですが、getEnv "QUERY_STRING"の要領で、他の環境変数も取得できます。REQUEST_METHODとか、REMOTE_ADDRとか。ちなみに、POSTパラメーターを取得するには、getContents関数を使います。


このコードをコンパイル

% ghc --make -o hello.cgi hello.hs

makeを使うと、必要なモジュールを取り込んでくれるらしいです。


今回は、Web用のライブラリを使わずにWebアプリを作ってみました。パラメーターの解析とかメンドーですね。次回は、Network.CGIあたりを使う的なカンジっぽいイメージです。今回の感想としては、コード修正してブラウザでチェックする前に、コンパイル作業が入るのがストレスフルでした。スクリプトはラクですね。



Real World Haskell

Real World Haskell

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証