Elm Json解码器管道错误

时间:2017-04-03 02:20:26

标签: json elm

我正在尝试解码来自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调用的内容有点模糊。我将不胜感激任何帮助。非常感谢!

1 个答案:

答案 0 :(得分:3)

您在邮件中声明:

CardFetch (Result Http.Error String)

这意味着成功的响应将产生String。但是,您的modelDecoder正在返回ModelmodelDecoder : Decoder Model

将您的消息声明更改为:

CardFetch (Result Http.Error Model)

并在更新功能中:

CardFetch (Ok incomingName) ->
    ( incomingName, Cmd.none )

应该有帮助。