如何在http-conduit中构造Manager对象?

时间:2012-04-03 18:26:44

标签: haskell

继续寻求执行dropbox query我正在使用http-conduit尝试执行POST请求,但我不确定如何构建Manager对象。

这是我到目前为止(以及有问题的一行):

data DropboxConfig = DropboxConfig { appKey :: String, appSecret :: String}

main = do
    let appKey = "asdfasdfasdfs"
    let appSecret = ";lkj;lkjlkjlkj"
    let config = DropboxConfig {appKey = appKey, appSecret = appSecret}
    let qs = buildQueryString config

    let req = def {method = methodPost, queryString = qs}

    resp <- http req (newManager)  --!Does Not work
    putStrLn $ unpack resp


buildQueryString :: DropboxConfig -> ByteString
buildQueryString config = pack $ "oauth_consumer_key="++(appKey config)++
        "&oauth_signature_method=HMAC-SHA1"++
        "&oauth_timestamp=137131200" ++
        "&oauth_nonce=4572616e48616d6d65724c61686176" ++
        "&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D

以下是我遇到的错误:

    Couldn't match expected type `http-conduit-1.3.0.1:Network.HTTP.Conduit.Manager.Manager'
                with actual type `http-conduit-1.3.0.1:Network.HTTP.Conduit.Manager.ManagerSettings
                                  -> IO http-conduit-1.3.0.1:Network.HTTP.Conduit.Manager.Manager'

1 个答案:

答案 0 :(得分:3)

类型签名说明了一切,真的:

newManager :: ManagerSettings -> IO Manager

这是一个IO操作,因此您必须一如既往地使用<-绑定它。它还需要ManagerSettings,因此您需要提供它。这样的事情应该这样做,我认为(不太熟悉库,只是遵循类型):

manager <- newManager def
resp <- http req manager

尽管如此,使用withManager可能更好一点,这样您就不必担心自己关闭它了。

withManager $ \manager -> do
  resp <- http req manager
  ...