2017-01-06 11 views
0

Я использую Network.Wreq, Control.Lens, Data.AesonИсключение: JSONError "тип содержимого ответа " приложение/random.v4 + JSON "" #Haskell

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

Network.Wreq.asJSON будет throw a JSONError, если тип содержимого ответа отличается от "application/json".

Я думаю, самый простой путь будет явно использовать эсон для декодирования тела ответа в формате 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