ohanhi/remotedata-http/3.0.0

NOTE: the latest version is 4.0.0

RemoteData.Http

Friendly abstraction over remote API communication in JSON.

Commands

get : String -> (WebData success -> msg) -> Decoder success -> Cmd msg

GET request as a command. Has a no-cache header to ensure data integrity.

type Msg
    = HandleGetCat (WebData Cat)


getCat : Cmd Msg
getCat =
    get "/api/cats/1" HandleGetCat catDecoder
post : String -> (WebData success -> msg) -> Decoder success -> Value -> Cmd msg

POST request as a command.

type Msg
    = HandlePostCat (WebData Cat)


postCat : Cat -> Cmd Msg
postCat cat =
    post "/api/cats/" HandlePostCat catDecoder (encodeCat cat)
put : String -> (WebData success -> msg) -> Decoder success -> Value -> Cmd msg

PUT request as a command.

type Msg
    = HandlePutCat (WebData Cat)


putCat : Cat -> Cmd Msg
putCat cat =
    put "/api/cats/" HandlePutCat catDecoder (encodeCat cat)
patch : String -> (WebData success -> msg) -> Decoder success -> Value -> Cmd msg

PATCH request as a command.

type Msg
    = HandlePatchCat (WebData Cat)


patchCat : Cat -> Cmd Msg
patchCat cat =
    patch "/api/cats/" HandlePatchCat catDecoder (encodeCat cat)
delete : String -> (WebData String -> msg) -> Value -> Cmd msg

DELETE request as a command, expecting a String response.

In many APIs, the response for successful delete requests has an empty HTTP body, so decoding it as JSON will always fail. This is why delete and deleteTask don't have a decoder argument. If you really want to decode the response, use Json.Decode.decodeString.

type Msg
    = HandleDeleteCat (WebData String)


deleteCat : Cat -> Cmd Msg
deleteCat cat =
    delete "/api/cats/" HandleDeleteCat (encodeCat cat)

Tasks

getTask : String -> Decoder success -> Task Never (WebData success)

GET request as a task. Has a no-cache header to ensure data integrity.

getCatTask : Task Never (WebData Cat)
getCatTask =
    getTask "/api/cats/1" catDecoder
postTask : String -> Decoder success -> Value -> Task Never (WebData success)

POST request as a task.

postCatTask : Cat -> Task Never (WebData Cat)
postCatTask cat =
    postTask "/api/cats/" catDecoder (encodeCat cat)
putTask : String -> Decoder success -> Value -> Task Never (WebData success)

PUT request as a task.

putCatTask : Cat -> Task Never (WebData Cat)
putCatTask cat =
    putTask "/api/cats/" catDecoder (encodeCat cat)
patchTask : String -> Decoder success -> Value -> Task Never (WebData success)

PATCH request as a task.

patchCatTask : Cat -> Task Never (WebData Cat)
patchCatTask cat =
    patchTask "/api/cats/" catDecoder (encodeCat cat)
deleteTask : String -> Value -> Task Never (WebData String)

DELETE request as a task, expecting a String response.

In many APIs, the response for successful delete requests has an empty HTTP body, so decoding it as JSON will always fail. This is why delete and deleteTask don't have a decoder argument. If you really want to decode the response, use Json.Decode.decodeString.

deleteCatTask : Cat -> Task Never (WebData String)
deleteCatTask cat =
    deleteTask "/api/cats/" (encodeCat cat)

Additional configuration

type alias Config =
{ headers : List Header
, withCredentials : Bool
, timeout : Maybe Float
}

If you need more control over the request, you can use the <verb>WithConfig function with a record like this.

specialConfig : Config
specialConfig =
    { headers = [ specialHeader, anotherHeader ]
    , withCredentials = True
    , timeout = Nothing
    }


postCat : Cat -> Cmd Msg
postCat cat =
    postWithConfig specialConfig "/api/cats/" HandlePostCat catDecoder (encodeCat cat)
defaultConfig : Config

The default configuration for all requests besides GET:

  • accept application/json
  • without credentials
  • no timeout
noCacheConfig : Config

The default configuration for GET requests:

  • a no-cache header
  • accept application/json
  • without credentials
  • no timeout
noCache : Header

Header that makes sure the response doesn't come from a cache. Only relevant for GET requests.

acceptJson : Header

Header for explicitly stating we are expecting JSON back.

Commands with configuration

Config
-> String
-> (WebData success -> msg)
-> Decoder success
-> Cmd msg

GET request as a command, with cache. NB. allowing cache in API GET calls can lead to strange conditions.

getWithConfig noCacheConfig "http://example.com/users.json" userDecoder
  == get "http://example.com/users.json" userDecoder

For a request without any headers, you can use:

getWithConfig defaultConfig url decoder
Config
-> String
-> (WebData success -> msg)
-> Decoder success
-> Value
-> Cmd msg

POST request as a command, with additional Config.

postWithConfig defaultConfig == postTask
Config
-> String
-> (WebData success -> msg)
-> Decoder success
-> Value
-> Cmd msg

PUT request as a command, with additional Config.

putWithConfig defaultConfig == putTask
Config
-> String
-> (WebData success -> msg)
-> Decoder success
-> Value
-> Cmd msg

PATCH request as a command, with additional Config.

patchWithConfig defaultConfig == patchTask
deleteWithConfig : Config -> String -> (WebData String -> msg) -> Value -> Cmd msg

DELETE request as a command, with additional Config.

deleteWithConfig defaultConfig == deleteTask

Tasks with configuration

getTaskWithConfig : Config -> String -> Decoder success -> Task Never (WebData success)

GET request as a task, with additional Config. NB. allowing cache in API GET calls can lead to strange conditions.

getTaskWithConfig noCacheConfig "http://example.com/users.json" userDecoder
  == getTask "http://example.com/users.json" userDecoder

For a request without any headers, you can use:

getTaskWithConfig defaultConfig url decoder
Config
-> String
-> Decoder success
-> Value
-> Task Never (WebData success)

POST request as a task, with additional Config.

postTaskWithConfig defaultConfig == postTask
Config
-> String
-> Decoder success
-> Value
-> Task Never (WebData success)

PUT request as a task, with additional Config.

putTaskWithConfig defaultConfig == putTask
Config
-> String
-> Decoder success
-> Value
-> Task Never (WebData success)

PATCH request as a task, with additional Config.

patchTaskWithConfig defaultConfig == patchTask
deleteTaskWithConfig : Config -> String -> Value -> Task Never (WebData String)

DELETE request as a task, with additional Config.

deleteTaskWithConfig defaultConfig == deleteTask

Helpers

Use elm-lang/url in place of the old url helper.