Elm读取非200响应的HTTP响应正文
如何读取非200 HTTP状态的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
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状态检查之外,该代码段几乎完全是复制和粘贴的。像这样复制和粘贴通常是最后的选择,但由于库的限制,这似乎是您目前唯一的选择之一。感谢您的建议。:)我将尝试一下。我还创建了一个问题,看看是否可以在库级别解决这个问题。