2

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

让 Warp 为 URL 渲染一些东西很容易(例如参见这里)

http://localhost:3000/foo

我怎样才能让它渲染

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

以某种方式内容取决于id查询参数?

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

如何使用 Warp 和 Aeson 通过 HTTP 传递 JSON

4

1 回答 1

2

我将在这个先前的答案上构建我的示例。

在这个上下文中最重要的模块是它Network.HTTP.Types,特别是Query类型。

您可以Query使用Request.QueryString

由于 aQuery只不过是 a [(ByteString, Maybe ByteString)],我们可以lookup从基础库中使用来找到合适的属性。

但是,由于lookup将类型包装在 aMaybe本身中,我们最终得到 a 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)
于 2014-03-04T23:49:12.423 回答