この前の回答に基づいて例を作成します。
このコンテキストで最も重要なモジュールはNetwork.HTTP.Types
、具体的にはQuery
型です。
を使用Query
して WAI からを取得できます。Request
QueryString
aQuery
は a にすぎないため、基本ライブラリから[(ByteString, Maybe ByteString)]
使用して適切な属性を見つけることができます。lookup
ただし、型を a自体にlookup
ラップするため、最終的には a になります。私の例には、これを.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)