Edited at

warpではじめる最小ウェブアプリケーション

More than 5 years have passed since last update.

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


simple_app.hs

{-# 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


simple_app.hs

{-# 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


simple_app.hs

{-# 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しそうな気がするのでこれでいいかなと。