好的,所以昨天我尝试真正使用 Happstack。
好的,所以我的实际问题。到目前为止我有这个:
data LambdaURL =
URL_CSS |
URL_Input |
URL_Output
instance PathInfo LambdaURL where
toPathSegments url =
case url of
URL_CSS -> ["Main.css"]
URL_Input -> ["Input.html"]
URL_Output -> ["Output.html"]
fromPathSegments =
(segment "Main.css" >> return URL_CSS ) <|>
(segment "Input.html" >> return URL_Input ) <|>
(segment "Output.html" >> return URL_Output)
route :: LambdaURL -> RouteT LambdaURL (ServerPartT IO) Response
route url =
case url of
URL_CSS -> serveFile (asContentType "text/css") "Main.css"
URL_Input -> ok $ toResponse $ page_Input
URL_Output -> ok $ toResponse $ page_Output
main = simpleHTTP nullConf $ implSite "www.example.com" "" (setDefault URL_Input $ mkSitePI (runRouteT route))
page_Input :: H.Html
page_Output :: H.Html
这就是关于网络路由的教程。现在我去阅读关于表单的教程,我意识到为了访问表单数据,你需要在ServerPart
monad 中,而不是在Html
monad 中。所以我最终做了类似的事情
generate_page_Output :: ServerPart Response
generate_page_Output = do
decodeBody (defaultBodyPolicy "." 0 65536 65536)
expr <- look "expr"
ok $ toResponse $ page_Output expr
page_Output :: String -> H.Html
现在我去修改route
函数来调用generate_page_Output
而不是page_Output
. 大概是这样的:
URL_Output -> generate_page_Output
好吧,你知道什么?这不会进行类型检查。route
生活在RouteT
monad 中,而我正在尝试在ServerPart
monad 中做事。最终我发现liftRouteT :: m a -> RouteT url m a
. 好像很有可能吧?因此,如果我将行更改为
URL_Output -> liftRouteT generate_page_Output
现在它编译了。有趣的是……现在输出页面的 URL 是 HTTP 404。此时我完全不知道为什么。我只是还没有找到正确的函数调用。
有人知道如何解决这个问题吗?