0

get リクエストを実行するこの関数があるとします。

import Network.HTTP.Conduit
import qualified Data.ByteString.Char8 as C8

get :: String -> [(C8.ByteString, C8.ByteString)] -> IO (Response LC8.ByteString)
get url par = do
  request <- parseUrl url 
  res <- withManager $ httpLbs $ createReq request
  return res
  where
    createReq req = 
      req {
            method = methodGet
          , queryString = map (\(k, v) -> k ++ "&=" ++ v) par -- ????
          }

クエリ文字列を作成するには、もっと簡単な方法が必要だと思います。「?」を気にしないため、私の方法は単純ではなく、間違っています。および "&" (最初に "?" が必要で、最後に "&" があってはなりません)。では、get リクエストのクエリ文字列を作成するにはどうすればよい[(C8.ByteString, C8.ByteString)]でしょうか。また、(++) は ByteString では使用できません。しかし、驚くべき例は見つかりませんでした。

4

1 に答える 1

4

パッケージにあるNetwork.HTTP.Types.URIの関数を使用します。http-types実際、http-typesの依存パッケージの 1 つですhttp-conduit

λ> import Network.HTTP.Types.URI
λ> import Data.ByteString
λ> :set -XOverloadedStrings
λ> let getData = [("key1", Just "value1"), ("key2", Just "value2")] :: [(ByteString, Maybe ByteString)]
λ> renderQuery True getData
"?key1=value1&key2=value2"
λ> renderQuery False getData
"key1=value1&key2=value2"

Bool値がリクエストのrenderQuery先頭にどのように表示されるかを確認してください。?

更新: からhttp-client 0.3.6Michael SnoymanはsetQueryStringにこの機能を追加しました (コメントで彼が示したとおり)。

于 2014-07-20T03:58:35.360 に答える