我使用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应用程序?
注意: 这里有一个修复(https://gist.github.com/1499226)如果您遇到“wai-handler-devel:command not found”的问题
答案 0 :(得分:5)
wai-handler-devel的Hackage page表示它应该从命令行调用,如下所示:
$ 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存储库中的SmallApp和FullApp示例;后者特别有用,因为它有调试输出显示重新加载期间的代码流,并显示如何集成长时间运行的数据库连接。
FullApp示例的run script还显示了如何以编程方式使用wai-handler-devel,包括手动指定Hamlet模板依赖项(wai-handler-devel
命令行工具determines automatically)。
然后,您应该能够重写main
,如下所示:
main :: IO ()
main = do
putStrLn $ "http://localhost:8080/"
myApp (run 8080)
当然,您可以轻松地从wai-handler-fastcgi,wai-handler-scgi甚至wai-handler-webkit传递run
功能。