ohanhi/remotedata-http/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)

Helpful headers

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

type alias Config =
{ headers : List Header
, timeout : Maybe Float
, tracker : Maybe String
, risky : Bool
}

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

specialConfig : Config
specialConfig =
    { defaultConfig | headers = [ specialHeader, anotherHeader ] }


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
  • no timeout
  • no tracker
  • not a risky request
noCacheConfig : Config

The default configuration for GET requests:

  • a no-cache header
  • accept application/json
  • without credentials
  • no timeout
  • no tracker
  • not a risky request
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 == post
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

These should be rather rarely used.

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

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

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

POST request as a task.

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

PUT request as a task.

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

PATCH request as a task.

patchCatTask : Cat -> Task () (WebData Cat)
patchCatTask cat =
    patchTask "/api/cats/" catDecoder (encodeCat cat)
deleteTask : String -> Value -> Task () (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 () (WebData String)
deleteCatTask cat =
    deleteTask "/api/cats/" (encodeCat cat)

Tasks with configuration

type alias TaskConfig =
{ headers : List Header
, timeout : Maybe Float
, risky : Bool
}

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

specialConfig : TaskConfig
specialConfig =
    { defaultConfig | headers = [ specialHeader, anotherHeader ] }


postCatTask cat =
    postTaskWithConfig specialConfig "/api/cats/" HandlePostCat catDecoder (encodeCat cat)
defaultTaskConfig : TaskConfig

The default configuration for all requests besides GET:

  • accept application/json
  • no timeout
  • not a risky request
noCacheTaskConfig : TaskConfig

The default configuration for GET requests:

  • a no-cache header
  • accept application/json
  • without credentials
  • no timeout
  • not a risky request
getTaskWithConfig : TaskConfig -> String -> Decoder success -> Task () (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 defaultTaskConfig url decoder
TaskConfig
-> String
-> Decoder success
-> Value
-> Task () (WebData success)

POST request as a task, with additional Config.

postTaskWithConfig defaultTaskConfig == postTask
TaskConfig
-> String
-> Decoder success
-> Value
-> Task () (WebData success)

PUT request as a task, with additional Config.

putTaskWithConfig defaultTaskConfig == putTask
TaskConfig
-> String
-> Decoder success
-> Value
-> Task () (WebData success)

PATCH request as a task, with additional Config.

patchTaskWithConfig defaultTaskConfig == patchTask
deleteTaskWithConfig : TaskConfig -> String -> Value -> Task () (WebData String)

DELETE request as a task, with additional Config.

deleteTaskWithConfig defaultTaskConfig == deleteTask