假设我有这个函数执行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 -- ????
}
我相信一定有一个更简单的方法来创建查询字符串。我的方法既不简单又错误,因为它不关心"?"one_answers"&"(开头必须有"?",结尾不能有"&")那么我如何为[(C8.ByteString, C8.ByteString)]
的get请求创建查询字符串呢?此外,(++)不能与ByteString一起使用。
使用http-types
包中存在的Network.HTTP.Types.URI中的函数。实际上,http-types
是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"
查看renderQuery
中的Bool
值如何控制将?
前置到请求。
更新:从http-client 0.3.6
开始,Michael Snoyman已经在setQueryString中添加了这个功能,正如他在评论中指出的。