elm / http 1.0.0定义Http.Error
为
type Error
= BadUrl String
| Timeout
| NetworkError
| BadStatus (Response String)
| BadPayload String (Response String)
但是2.0.0将其更改为
type Error
= BadUrl String
| Timeout
| NetworkError
| BadStatus Int
| BadBody String
在收到BadStatus
时,我无法获取请求的正文,只能获取状态码。埃文(Evan)在docs中提出了解决方案,但是我不知道如何使它起作用。
如果我们定义与{p>类似的expectJson
expectJson : (Result Http.Error a -> msg) -> D.Decoder a -> Expect msg
expectJson toMsg decoder =
expectStringResponse toMsg <|
\response ->
case response of
Http.BadStatus_ metadata body ->
Err (Http.BadStatus metadata.statusCode)
...
然后我们可以访问元数据和正文,但是我该如何使用它们呢?我应该定义自己的myBadStatus
并返回它吗?
Http.BadStatus_ metadata body ->
Err (myBadStatus metadata.statusCode body)
这项工作可以吗?
我需要转换以下代码:
myErrorMessage : Http.Error -> String
myErrorMessage error =
case error of
Http.BadStatus response ->
case Decode.decodeString myErrorDecoder response.body of
Ok err ->
err.message
Err e ->
"Failed to parse JSON response."
...
谢谢。
答案 0 :(得分:1)
编辑22/4/2019 :我将http-extras的2.0+版本更新了此答案,该API进行了一些更改。感谢Berend de Boer指出这一点!
以下答案提供了使用我编写的程序包(根据请求)的解决方案,但您不必使用该程序包!我写了entire article,介绍了如何从HTTP响应中提取详细信息,其中包括多个不需要该软件包的Ellie示例以及一个使用该软件包的示例。
正如Francesco所述,我正是使用问题https://package.elm-lang.org/packages/jzxhuang/http-extras/latest/中描述的类似方法为此目的创建了一个程序包。
特别是要使用Http.Detailed
的模块。它定义了一个Error类型,使原始主体保持在错误状态:
type Error body
= BadUrl String
| Timeout
| NetworkError
| BadStatus Metadata body Int
| BadBody Metadata body String
发出这样的请求:
type Msg
= MyAPIResponse (Result (Http.Detailed.Error String) ( Http.Metadata, String ))
sendRequest : Cmd Msg
sendRequest =
Http.get
{ url = "/myapi"
, expect = Http.Detailed.expectString MyAPIResponse
在您的更新中,处理结果,包括当它为BadStatus时解码正文:
update msg model =
case msg of
MyAPIResponse httpResponse ->
case httpResponse of
Ok ( metadata, respBody ) ->
-- Do something with the metadata if you need! i.e. access a header
Err error ->
case error of
Http.Detailed.BadStatus metadata body statusCode ->
-- Try to decode the body the body here...
...
...
感谢弗朗西斯科(Francisco)与我联系,希望这个答案可以帮助遇到与OP相同问题的任何人。