Elm读取非200响应的HTTP响应正文

Elm读取非200响应的HTTP响应正文,elm,Elm,如何读取非200 HTTP状态的HTTP响应正文 getJson : String -> String -> Effects Action getJson url credentials = Http.send Http.defaultSettings { verb = "GET" , headers = [("Authorization", "Basic " ++ credentials)] , url = url , body = Http.e

如何读取非200 HTTP状态的HTTP响应正文

getJson : String -> String -> Effects Action
getJson url credentials =
  Http.send Http.defaultSettings
    { verb = "GET"
    , headers = [("Authorization", "Basic " ++ credentials)]
    , url = url
    , body = Http.empty
    }
    |> Http.fromJson decodeAccessToken
    |> Task.toResult
    |> Task.map UpdateAccessTokenFromServer
    |> Effects.task
上面提到的错误来自

Task.toResult : Task Http.Error a -> Task x (Result Http.Error a)
其价值变成

(错误响应400(“错误请求”))

我的服务器在响应主体中以JSON负载的形式响应请求的错误。请帮助我将其从任务x a检索到下面的ServerResult

type alias ServerResult = { status : Int, message : String }
没有公开将200到300范围之外的HTTP代码视为非错误响应的简单方法。看看源代码

但是,通过从Http包源代码复制和粘贴一点,您可以创建一个自定义函数来替换
Http.fromJson
,以便处理正常“成功”范围之外的Http状态代码

下面是一个简单的示例,您需要复制并粘贴以创建一个自定义的
myFromJson
函数,该函数与Http包的作用相同,只是它也将400视为成功:

myFromJson:Json.Decoder a->Task Http.rawrerror Http.Response->Task Http.Error a
myFromJson解码器响应=
让我们解码str=
的case Json.decodeString解码器str
确定->任务。成功
Err msg->Task.fail(Http.UnexpectedPayload msg)
在里面
Task.mapError promoteError响应
`任务。然后我的手回应解码
MyHandlerResponse:(字符串->任务Http.Error a)->Http.Response->任务Http.Error a
MyHandlerResponse句柄响应=
如果(200
句柄str
_ ->
Task.fail(Http.UnexpectedPayload“响应主体是blob,应为字符串”)
其他的
Task.fail(Http.BadResponse.status response.statusText)
--从Http包复制了逐字记录,因为它未公开
promoteError:Http.rawrError->Http.Error
promoteError rawError=
案例错误
Http.RawTimeout->Http.Timeout
Http.RawNetworkError->Http.NetworkError
同样,除了400状态检查之外,该代码段几乎完全是复制和粘贴的。像这样复制和粘贴通常是最后的选择,但由于库的限制,这似乎是您目前唯一的选择之一。

感谢您的建议。:)我将尝试一下。我还创建了一个问题,看看是否可以在库级别解决这个问题。