5

我有使用 wai 的基本“hello world”应用程序设置,并且想使用 wai-handler-devel,但我不确定如何去做,也找不到在 wai 项目中使用它的任何示例。

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 () -- Just for an orphan instance

app :: Application
app _ = return $ responseLBS
    status200
    [("Content-Type", "text/plain")]
    "Hello, World!"

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    run 8080 app

我需要做什么才能让 wai-handler-devel 使用基本的 wai 应用程序?

注意:如果您遇到“wai-handler-devel: command not found”问题,这里有一个修复(https://gist.github.com/1499226 )

4

1 回答 1

5

wai-handler-devel 的Hackage 页面说应该从命令行调用它,如下所示:

$ wai-handler-devel <port> My.App.Module myApp

并且您的应用程序的类型必须如下所示:

myApp :: (Application -> IO ()) -> IO ()

在这种情况下,您应该定义myApp如下:

myApp :: (Application -> IO ()) -> IO ()
myApp handler = handler app

尽管您可能希望app完全内联:

myApp :: (Application -> IO ()) -> IO ()
myApp handler = handler $ \_ -> return $ responseLBS
    status200
    [("Content-Type", "text/plain")]
    "Hello, World!"

类型是这样的,以便您可以在启动时进行初始化等IO。我建议阅读 wai-handler-devel 的 git 存储库中的SmallAppFullApp示例;后者特别有用,因为它具有显示重新加载期间代码流的调试输出,并显示了如何集成长时间运行的数据库连接。

FullApp 示例的运行脚本wai-handler-devel还展示了如何以编程方式使用 wai-handler-devel,包括手动指定 Hamlet 模板依赖项(命令行工具自动确定)。

然后你应该能够重写你main的如下:

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    myApp (run 8080)

当然,您也可以轻松地runwai-handler-fastcgiwai-handler-scgi甚至wai-handler-webkit传递函数。

于 2011-12-17T07:11:25.073 回答