LoginSignup
17
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-24

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

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17