为get请求构建查询字符串

时间:2014-07-20 03:36:04

标签: haskell networking 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 -- ????
          }

我认为必须有一种更简单的方法来创建查询字符串。我的方法既不简单也不错,因为它并不关心&#34;?&#34;和&#34;&amp;&#34; (在开始时必须有&#34;?&#34;并且最后不得为&#34;&amp;&#34;)。那么如何为[(C8.ByteString, C8.ByteString)]的get请求创建查询字符串?而且,(++)不能与ByteString一起使用。但我还没有发现任何令人惊讶的例子。

1 个答案:

答案 0 :(得分:4)

使用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"

了解Bool控件中的renderQuery值如何将?添加到请求中。

更新:从http-client 0.3.6开始,Michael Snoyman已在setQueryString中添加此功能,如他在评论中所示。