我正在使用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都会返回相同类型的数据。
答案 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