使用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)