为get请求构建查询字符串



假设我有这个函数执行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-typeshttp-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中添加了这个功能,正如他在评论中指出的。

相关内容

  • 没有找到相关文章

最新更新