HaskellでWeb Applicationをはじめてみたいと思う。
調べてみると、Rubyのrackのようなものとしてwaiがある。
stackを使って最小のサンプルをつくってみる。
stackは別途インストールして欲しい。Mac OSXなら
$ brew install haskell-stack
でインストールできる。他の環境はこちらで確認してください。
はじめに、プロジェクトをつくります。名前は wai-sampleとしました。
$ stack new wai-sample simple
$ cd wai-spmale
wai-sampleディレクトリが生成されます。
プログラムはwai-sample/src
に書いていくことになります。
利用するライブラリを追加してあげる必要があります。waiとwarpとhttp-typeを使うので、wai-sample.cabal
に追加します。
build-depends: base >= 4.7 && < 5
, warp, wai, http-types
となるように、以下のコマンドを実行します。
$ echo " , wai, warp, http-types" >> wai-sample.cabal
"Hello wai"と出力するウェブサーバをつくってみます。
とある事情で環境変数PORTでポートを切り替えられるようにしています。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.Wai (responseLBS, Application)
import Network.HTTP.Types (status200)
import Network.Wai.Handler.Warp (run, Port)
import System.Environment (getEnvironment)
import Data.List (lookup)
import Data.Maybe
main :: IO ()
main = do
port <- getPort
putStr "start Server: http://localhost:"
print port
run port helloApp
helloApp :: Application
helloApp req respond = respond $ responseLBS status200 [] "Hello wai"
getPort :: IO Port
getPort = getEnvironment >>= return . port
where
port = fromMaybe defaultPort . fmap read . lookup "PORT"
defaultPort :: Port
defaultPort = 3000
記述ができたら、コンパイルして実行してみましょう。
$ stack build
$ stack exec wai-sample
stack build
でビルドできて、execにプロジェクト名で実行できます。
http://localhost:3000 にアクセスすれば, 「Hello wai」と表示されます。
とても簡単です。
ソースコード: https://github.com/eiel/wai-sample
Docke Image: https://hub.docker.com/r/eiel/wai-sample/
もっと詳しく
Haskell三大Webアプリケーションフレームワークは
- yesod
- snap
- HappStack
らしいです。今回利用しているのはwaiを採用しているのはyesodのみ。
yesodはいろいろ便利ですがハードルが少し高いように思います。
waiに対応しているウェブサーバの、warpが良さそうなので、waiを使うことにしました。
waiに対応しているフレームワークでyesod以外にはscotty、 spockなどがあり、yesodよりは入門しやすいです。
今回はフレームワークを使わないサンプルを用意しました。
プロジェクトを作成するのに使用した newサブコマンドですが、第2引数(全体でみると第3引数)はテンプレート名です。
stack new wai-sample simple
であればsimpleというtemplateを利用しています。
templateの一覧は
stack templates
で確認できます。