在 Warp 中处理 HTTP GET 查询参数



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

很容易(参见此处的示例)使 Warp 为诸如 URL 呈现一些内容

http://localhost:3000/foo

如何使其渲染

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

内容依赖于id查询参数的方式?

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

如何使用Warp与Aeson通过HTTP交付JSON

我将在前面的答案上构建我的示例。

在这种情况下,它Network.HTTP.Types最重要的模块,特别是Query类型。

您可以使用 WAI Request获取Query QueryString

由于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)

最新更新