使用warp HTTP服务器,我想处理HTTP查询参数。
很容易(例如参见here)让Warp为像
这样的网址呈现内容http://localhost:3000/foo
如何渲染
http://localhost:3000/foo?id=bar
内容取决于id
查询参数?
此外,如果没有这样的参数,我该如何处理?
答案 0 :(得分:2)
我将在this previous answer上构建我的示例。
此上下文中最重要的模块Network.HTTP.Types
,特别是Query
类型。
您可以使用QueryString
从WAI Query
获得Request
。
由于Query
只是[(ByteString, Maybe ByteString)]
,我们可以使用基础库中的lookup
来查找相应的属性。
但是,由于lookup
将该类型包含在Maybe
本身中,我们最终会以Maybe (Maybe ByteString)
结束。我的示例包含一个相当丑陋的函数maybeMaybeToMaybe
,将其转换为Maybe ByteString
。
该示例返回包含id
查询参数的明文响应(在任何URL上)。因为它仅使用show
,例如URL
http://localhost:3000/foo?id=bar
它产生
Query parameter: Just "foobar"
而
http://localhost:3000/
它产生
Query parameter: Nothing
以下是完整的源代码:
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative ((<$>))
import Control.Monad
import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types (status200)
import Network.HTTP.Types.Header (hContentType)
import Blaze.ByteString.Builder.Char.Utf8 (fromString)
import Data.ByteString (ByteString)
main = do
let port = 3000
putStrLn $ "Listening on port " ++ show port
run port app
app req f = f $
case pathInfo req of
-- Place custom routes here
_ -> anyRoute req
anyRoute req =
let query = queryString req :: [(ByteString, Maybe ByteString)]
idParam = join $ lookup "id" query :: Maybe ByteString
in responseBuilder
status200
[(hContentType, "text/plain")]
$ fromString $ "Query parameter: " ++ (show idParam)