使用 warp HTTP 服务器,我想处理 HTTP 查询参数。
让 Warp 为 URL 渲染一些东西很容易(例如参见这里)
http://localhost:3000/foo
我怎样才能让它渲染
http://localhost:3000/foo?id=bar
以某种方式内容取决于id
查询参数?
另外,如果没有这样的参数,我该如何处理?
使用 warp HTTP 服务器,我想处理 HTTP 查询参数。
让 Warp 为 URL 渲染一些东西很容易(例如参见这里)
http://localhost:3000/foo
我怎样才能让它渲染
http://localhost:3000/foo?id=bar
以某种方式内容取决于id
查询参数?
另外,如果没有这样的参数,我该如何处理?
我将在这个先前的答案上构建我的示例。
在这个上下文中最重要的模块是它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)