无法创建自定义标题以在" withManager"中使用它。

时间:2015-06-10 04:09:51

标签: haskell

我无法在不使用OverloadedStrings的情况下创建自定义标题

import Data.Aeson
import qualified Data.ByteString.Lazy as B
import Network.HTTP.Conduit

import qualified Network.HTTP.Headers as HHeaders
import qualified Network.HTTP.Types as HTypes
import qualified Data.ByteString.Char8 as C8
import qualified Data.ByteString.Lazy.Char8 as LC8

-- myHeader1 = (HHeaders.HdrAccept $ C8.pack "some data")
myHeader1 = HHeaders.mkHeader HHeaders.HdrAccept "some data"

get :: String -> IO (Response LC8.ByteString)
get url1 = do
  req1 <- parseUrl url1
  res1 <- withManager $ httpLbs req1 { method = HTypes.methodGet, requestHeaders = [myHeader1] }
  return res1

错误:

Couldn't match type ‘HHeaders.Header’
                   with ‘(HTypes.HeaderName, C8.ByteString)’
    Expected type: HTypes.Header
      Actual type: HHeaders.Header
    In the expression: myHeader1
    In the ‘requestHeaders’ field of a record

我做错了什么?

1 个答案:

答案 0 :(得分:1)

Network.HTTP.ConduitNetwork.HTTP.Headers来自不兼容的HTTP库。可以使用http-conduit库创建http-client / http-types的请求标头:

import Data.Aeson
import qualified Data.ByteString.Lazy as B
import Network.HTTP.Conduit as HHeaders
import qualified Network.HTTP.Types as HTypes
import qualified Data.ByteString.Char8 as C8
import qualified Data.ByteString.Lazy.Char8 as LC8

myHeader1 = (HTypes.hAccept, C8.pack "some data")

get :: String -> IO (Response LC8.ByteString)
get url1 = do
  req1 <- parseUrl "some url"
  res1 <- withManager $ httpLbs req1 { method = HTypes.methodGet, requestHeaders = [myHeader1] }
  return res1

澄清:

您从HTTP库导入Network.HTTP.Headers。虽然导入看起来很相似,但这是一个独立的库,它定义了它自己的头类型,而不是用于http类型。

http-clienthttp-types兼容。如果您按照RequestHeader的定义操作,则会引导您http-types

将来,检查正交库兼容性的一种方法是查看构建取决于Hackage索引或尽可能遵循类型。