warpでscottyとかyesodは使わず、最小な感じのウェブアプリケーションを作るメモ。
頭が混乱したときにはこういうところから追いかけなおしたい。
追記:warp3.0及びwai3.0に対応しました。
バージョンは以下。使用環境はWindows7。
warp3.0
wai3.0になって、IFが少し変わりました。
とはいえ、コード的には、クライアントにレスポンスを返すメソッドを受け取ってそれを使うようになることだけの差になりました。
- ghc 7.6.3
- wai-3.0.0.2
- warp-3.0.0.3
- http-types-0.8.5
{-# LANGUAGE OverloadedStrings #-}
import qualified Network.Wai as Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.HTTP.Types.Status as Status
simpleApp :: Wai.Application
simpleApp req respond = do
putStrLn . show . Wai.pathInfo $ req -- とりあえずリクエストのパスとか表示してみる。
respond $ Wai.responseLBS Status.status200 [] "test"
main :: IO ()
main = do
let port = 3000 -- とりあえずポート3000番で。
let setting = Warp.setPort port Warp.defaultSettings
putStrLn $ "start server port=" ++ show port
Warp.runSettings setting simpleApp
warp2.1
warpの2.1でポート設定のIFが変わったみたいです。
- ghc 7.6.3
- wai-2.1.0
- warp-2.1.3
- http-types-0.8.3
{-# LANGUAGE OverloadedStrings #-}
import qualified Network.Wai as Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.HTTP.Types.Status as Status
simpleApp :: Wai.Application
simpleApp req = do
putStrLn . show . Wai.pathInfo $ req -- とりあえずリクエストのパスとか表示してみる。
return $ Wai.responseLBS Status.status200 [] "test"
main :: IO ()
main = do
let port = 3000 -- とりあえずポート3000番で。
let setting = Warp.setPort port Warp.defaultSettings
putStrLn $ "start server port=" ++ show port
Warp.runSettings setting simpleApp
warp2.0
- ghc 7.6.3
- wai-2.0.0
- warp-2.0.3.2
- http-types-0.8.3
{-# LANGUAGE OverloadedStrings #-}
import qualified Network.Wai as Wai
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.HTTP.Types.Status as Status
simpleApp :: Wai.Application
simpleApp req = do
putStrLn . show . Wai.pathInfo $ req -- とりあえずリクエストのパスとか表示してみる。
return $ Wai.responseLBS Status.status200 [] "test"
main :: IO ()
main = do
let port = 3000 -- とりあえずポート3000番で。
let setting = Warp.defaultSettings { Warp.settingsPort = port
}
putStrLn $ "start server port=" ++ show port
Warp.runSettings setting simpleApp
ビルドと実行
ビルドは以下で適当に。
ghc -O2 -Wall simple_app.hs -o simple_app.exe
実行。
./simple_app.exe
ためしにリクエストしてみる。
wget --save-headers -O - -o - http://localhost:3000/path/of/test/
応答。
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Jun 2014 16:41:54 GMT
Server: Warp/3.0.0.3
test
実行したコンソールの出力
start server port=3000
["path","of","test",""]
感想(warp3.0時点)
wai3.0でまたIFが変わったのでちょっとびっくりですね。
wai2.0よりちょっとわかりにくかい気はしますが、ResourceTとかがあるよりははるかにいいですね。
感想(warp2.0時点)
waiが2.0になる前はResourceTがうざかったけど、wai2.0のIFはすごくわかりやすくていいですね。
type Application = Request -> IO Response
「リクエストを受け取って副作用を与えて(与えなくても可)レスポンスを返すのが(ウェブ)アプリケーションだ!」という感じの定義がしっくりきます。
Warp.runSettings setting simpleApp
ではなくWarp.run port simpleApp
の方がよりコンパクトな感じだけど、大抵はrunSettings
しそうな気がするのでこれでいいかなと。