我正在尝试解码来自http请求的一些json,但我一直在遇到语法问题。这是我从编译器得到的错误:
-- TYPE MISMATCH ------------------------------------------------------ [7/1811$
The 2nd argument to function `send` is causing a mismatch.
65| Http.send CardFetch (Http.get url modelDecoder)
^^^^^^^^^^^^^^^^^^^^^^^^^
Function `send` is expecting the 2nd argument to be:
Http.Request String
But it is:
Http.Request Model
这是我的代码:
module Main exposing (..)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as Decode exposing (string, Decoder, at, index)
import Json.Decode.Pipeline exposing (..)
main : Program Never Model Msg
main =
program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
type alias Model =
{ boardName : String
, cardName : String
}
init =
( Model "Default Board" "Default Card"
, Cmd.none
)
-- UPDATE
type Msg
= CardFetch (Result Http.Error String)
| DataFetch
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
DataFetch ->
( model, getData )
CardFetch (Ok incomingName) ->
( Model model.cardName incomingName, Cmd.none )
CardFetch (Err errorMessage) ->
( model, Debug.log "Errors" Cmd.none )
-- HTTP
url : String
url =
"https://api.trello.com/1/members/user/actions?limit=3&key=..."
getData =
Http.send CardFetch (Http.get url modelDecoder)
{--decodeCard =
Decode.index 0
modelDecoder
(Decode.at
[ "data", "card", "name" ]
string
)
--}
modelDecoder : Decoder Model
modelDecoder =
decode Model
|> custom (index 0 (at [ "data", "card", "name" ] string))
|> custom (index 0 (at [ "data", "board", "name" ] string))
--UPDATE
-- VIEW
view : Model -> Html Msg
view model =
div []
[ div []
[ button [ onClick DataFetch ] [ text "Get Card" ] ]
, div [ class "card" ]
[ h3 [] [ text model.boardName ]
, div [ class "board" ] [ h4 [] [ text model.cardName ] ]
]
]
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
我对Elm相当陌生,我正试图弄清楚API调用是如何工作的。榆树文档非常好,但有关API调用的内容有点模糊。我将不胜感激任何帮助。非常感谢!
答案 0 :(得分:3)
您在邮件中声明:
CardFetch (Result Http.Error String)
这意味着成功的响应将产生String。但是,您的modelDecoder
正在返回Model
:modelDecoder : Decoder Model
。
将您的消息声明更改为:
CardFetch (Result Http.Error Model)
并在更新功能中:
CardFetch (Ok incomingName) ->
( incomingName, Cmd.none )
应该有帮助。