アレッ*_*ックス 0 networking haskell http-conduit
假设我有这个函数执行 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 -- ????
}
Run Code Online (Sandbox Code Playgroud)
我相信必须有一种更简单的方法来创建查询字符串。我的方法既不简单也不错误,因为它不关心“?” 和“&”(开头必须有“?”,结尾不能有“&”)。那么如何为来自的 get 请求创建查询字符串呢[(C8.ByteString, C8.ByteString)]?此外,(++) 不能与 ByteString 一起使用。但我还没有发现任何令人惊讶的例子。
使用包中存在的Network.HTTP.Types.URIhttp-types中的函数。事实上,http-types是http-conduit.
\xce\xbb> import Network.HTTP.Types.URI\n\xce\xbb> import Data.ByteString\n\xce\xbb> :set -XOverloadedStrings\n\xce\xbb> let getData = [("key1", Just "value1"), ("key2", Just "value2")] :: [(ByteString, Maybe ByteString)]\n\xce\xbb> renderQuery True getData\n"?key1=value1&key2=value2"\n\xce\xbb> renderQuery False getData\n"key1=value1&key2=value2"\nRun Code Online (Sandbox Code Playgroud)\n\n查看控制Bool中的值如何添加到请求之前。renderQuery?
更新:从 开始http-client 0.3.6,Michael Snoyman在setQueryString中添加了此功能,正如他在评论中指出的那样。