假设我有这个函数执行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 -- ????
}
我认为必须有一种更简单的方法来创建查询字符串。我的方法既不简单也不错,因为它并不关心&#34;?&#34;和&#34;&amp;&#34; (在开始时必须有&#34;?&#34;并且最后不得为&#34;&amp;&#34;)。那么如何为[(C8.ByteString, C8.ByteString)]
的get请求创建查询字符串?而且,(++)不能与ByteString一起使用。但我还没有发现任何令人惊讶的例子。
答案 0 :(得分:4)
使用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"
了解Bool
控件中的renderQuery
值如何将?
添加到请求中。
更新:从http-client 0.3.6
开始,Michael Snoyman已在setQueryString中添加此功能,如他在评论中所示。