gpt4 book ai didi

http - 榆树 0.19 : How to obtain request body when receiving BadStatus with elm/http 2. 0.0

转载 作者:可可西里 更新时间:2023-11-01 16:20:14 28 4
gpt4 key购买 nike

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 时,我无法获取请求的主体,只能获取状态代码。在docs Evan 为此提出了一个解决方案,但我不明白如何让它发挥作用。

如果我们定义自己的 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."
...

谢谢。

最佳答案

编辑 22/4/2019:我针对 2.0+ 版的 http-extras 更新了此答案,其中有一些 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 相同问题的任何人。

关于http - 榆树 0.19 : How to obtain request body when receiving BadStatus with elm/http 2. 0.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54379403/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com