2

warp HTTP サーバーを使用して、HTTP クエリ パラメータを処理したいと考えています。

次のような URL に対して Warp に何かをレンダリングさせるのは簡単です (たとえば、こちらを参照)。

http://localhost:3000/foo

レンダリングするにはどうすればよいですか

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

idコンテンツがクエリパラメータに依存する方法で?

さらに、そのようなパラメーターがない場合、どのように処理できますか?

Aeson で Warp を使用して HTTP 経由で JSON を配信する方法

4

1 に答える 1

2

この前の回答に基づいて例を作成します。

このコンテキストで最も重要なモジュールはNetwork.HTTP.Types、具体的にはQuery型です。

を使用Queryして WAI からを取得できます。RequestQueryString

aQueryは a にすぎないため、基本ライブラリから[(ByteString, Maybe ByteString)]使用して適切な属性を見つけることができます。lookup

ただし、型を a自体にlookupラップするため、最終的には a になります。私の例には、これを.MaybeMaybe (Maybe ByteString)maybeMaybeToMaybeMaybe 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 に答える