例外:JSONError“内容类型的响应是\”application / random.v4 + json \“”#Haskell

时间:2017-01-06 16:01:13

标签: json haskell ghci aeson

我正在使用Network.Wreq,Control.Lens,Data.Aeson

getInfo = do
    let opts = defaults && header "Accept" .~ ["application/random.v4+json"] "Content-Type" .~ ["application/json"]
    resp <- asJSON =<< getWith opts "url" :: IO (Response (Map String Value))
    let respBody = resp ^. responseBody
    return respBody

回复有Content-Type → application/random.v4+json

当我调用该函数时,它抛出异常说

Exception: JSONError "content type of response is \"application/random.v4+json\""

但是当我调用一个API,其响应很简单Content-Type → application/json而不是有点Content-Type → application/random.v4+json

我的功能完全符合预期。如果回复contenty-type更改为application/json以外的任何内容,则会向我发出上述错误。

为什么会抛出异常?如何使它适用于我的API的所有版本?

**注意:两个版本的API都会返回相同类型的数据。

1 个答案:

答案 0 :(得分:1)

如果回复的内容类型与Network.Wreq.asJSON不同,

"application/json"throw a JSONError

我想最简单的方法是明确使用Aeson将响应体解码为json:

getInfo = do
    let opts = defaults && header "Accept" .~ ["application/random.v4+json"] "Content-Type" .~ ["application/json"]
    resp <- getWith opts "url"
    let respBody = decodeResponseBody $ resp ^. responseBody
    return respBody
  where
    decodeResponseBody :: ByteString -> Map String Value
    decodeResponseBody body =
      case eitherDecode' body of
        Left err -> fail err
        Right val -> return val