在Warp中处理HTTP GET查询参数

时间:2014-03-04 23:49:12

标签: http haskell query-parameters haskell-warp

使用warp HTTP服务器,我想处理HTTP查询参数。

很容易(例如参见here)让Warp为像

这样的网址呈现内容
http://localhost:3000/foo

如何渲染

http://localhost:3000/foo?id=bar

内容取决于id查询参数?

此外,如果没有这样的参数,我该如何处理?

How to deliver JSON over HTTP using Warp with Aeson

1 个答案:

答案 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)
相关问题