如何在elm中使用HTTP 2.0.0避免Expect msg?
在elm的如何在elm中使用HTTP 2.0.0避免Expect msg?,elm,Elm,在elm的Http 1.0.0包中,我可以发送一个自定义请求,如: post : Endoint -> List (Http.Header) -> Http.Body -> Decoder a -> Http.Request a post url headers body decoder = Http.request { method = "POST" , headers = headers , url = url
Http 1.0.0
包中,我可以发送一个自定义请求,如:
post : Endoint -> List (Http.Header) -> Http.Body -> Decoder a -> Http.Request a
post url headers body decoder =
Http.request
{ method = "POST"
, headers = headers
, url = url
, body = body
, expect = Http.expectJson decoder
, timeout = Nothing
, withCredentials = False
}
使用我上面写的post
函数,我可以简单地用解码器字符串调用它,在Http请求发送后,响应字符串将被解码并返回。时期无需创建类似以下内容的Msg
:
type Msg
= GotText (Result Http.Error String)
无需在update
中编写分支来处理此Msg
但是,从Http 2.0.0开始,expect
参数的类型为expect msg
,而不是expect a
,这意味着现在需要编写msg
变体和要更新的附加分支
我正在编写一个发出Http请求的Api.elm
文件。但是,这意味着现在它必须有自己的Msg
类型和update
函数才能在这些请求响应后运行
我过去认为Home.elm
应该只响应Home.Msg
和Home.update
的消息,而不是Api.Msg
和Api.update
。我错了吗?Api.elm
是否应该有自己的Msg
类型和update
功能来更改其他页面?或者有更好的方法吗?为了澄清我在问题中的解释:
Elm HTTP 2.0.0包中的自定义请求如下所示:
request :
{ method : String
, headers : List Header
, url = String
, body = Body
, expect = Expect msg
, timeout = Maybe Float
, withCredentials = Maybe String
}
-> Cmd msg
request :
{ method : String
, headers : List Header
, url : String
, body : Body
, expect : Expect a
, timeout : Maybe Float
, withCredentials : Bool
}
-> Request a
在Http 1.0.0中,它看起来是这样的:
request :
{ method : String
, headers : List Header
, url = String
, body = Body
, expect = Expect msg
, timeout = Maybe Float
, withCredentials = Maybe String
}
-> Cmd msg
request :
{ method : String
, headers : List Header
, url : String
, body : Body
, expect : Expect a
, timeout : Maybe Float
, withCredentials : Bool
}
-> Request a
不同之处在于,使用HTTP 2.0.0中的自定义请求时,我需要传入Msg
来使用此请求
现在,我的问题是:我使用的是Api.elm
文件。每次需要发出HTTP请求时,我都会从(比如)Login.elm调用Api.request arg1 arg2…
由于Api.elm
中的request
函数需要一个Msg
类型,在这种情况下,一个登录请求,我想我必须在Api.elm
中定义Msg
的GotLogin
,然后通过在Api.elm
中为GotLogin
编写一个update
分支来处理GotLogin
将如何更新login.elm
但是,我可以在Login.elm
中定义GotLogin
Msg
,并将其传递到Api.request
。因为我在Login.elm
中定义了GotLogin
,所以我将在Login.elm
的更新函数中放置一个GotLogin
分支,而不是Api.elm
这也适用于来自任何其他页面的任何其他请求类型(Signup.elm
,Home.elm
,…),这意味着Api.elm
,不应该有自己的更新其他页面的update
函数
Login.elm
拥有自己的update
功能的整个要点是,它应该只受自己的update
功能的分支的影响,不是来自Api.elm
的函数,为什么不将a->msg
函数传递给Api
函数呢?这正是我到目前为止所做的,但现在我正在进行身份验证。因此,Api.elm
定义了一个不透明的Token
类型。要将此类型返回到Signup.elm
,它必须发出两个Http请求,如果不使用Api.Msg
和Api.update
,我不知道如何返回@格伦,你说得对。我可以处理调用模块端的所有更新逻辑,这不会影响令牌的透明度。谢谢大家!@glennsl@glennsl,如果回答了这个问题,你能把它添加到下面吗?否则人们(像我一样)会来这里试图回答这个问题:-)我也面临着同样的问题。不过我不明白解决办法。是否有人能提供一个详细的回复/示例,说明这项工作需要什么?