Skip to content

A high level HTTP client for Haskell that focuses on ease of use

License

Notifications You must be signed in to change notification settings

owainlewis/http-dispatch

Repository files navigation

HTTP Dispatch

This is the HTTP library I wish I had when first learning Haskell

CircleCI

Available on Hackage: You'll want to use a version at 0.6.2.0 or greater

https://hackage.haskell.org/package/http-dispatch-0.6.2.0

A high level Haskell HTTP client with a friendly and consistent API. This library builds upon the http-client library, providing an (IMO) easier and more intuative API

There are only two types (HTTPRequest and HTTPResponse). Everything else is sugar for constructing these types

Differences from http-client

  • Simple DSL (only two types HTTPRequest and HTTPResponse)
  • Higher level API
  • No exceptions thrown on non 200 status codes
  • Supports TLS out of the box

Differences from wreq

  • Lighter
  • Doesn't require lens package

Motivation

There are already a couple of really good HTTP clients for Haskell (Wreq, HTTP Client), but typically I'd need to go hunting through documentation just to do even the simplest thing (or having to import a different package for https). This is the HTTP library I wish I had when first learning Haskell.

This library strips back everything to be as simple as possible. It will transparently support HTTPS and has a very consistent DSL for making requests.

There are only two types. A HTTPRequest and a HTTPResponse. That's all there is to know about this library.

Some utility functions are provided to make constructing requests easier but it's nothing more than sugar for creating types.

HTTP Request

A HTTP request has a method, url, a list of headers and an optional body. Header is a type synonym for a ByteString pair i.e (S.ByteString, S.ByteString). The body is a strict ByteString.

data HTTPRequest = HTTPRequest {
    method  :: RequestMethod
  , url     :: String
  , headers :: [(S.ByteString, S.ByteString)]
  , body    :: Maybe S.ByteString
} deriving ( Eq, Ord, Show )

HTTP Response

A HTTP response has a status, a list of headers, and a response body. Header is a type synonym for a ByteString pair i.e (S.ByteString, S.ByteString). The body is a strict ByteString.

data HTTPResponse = HTTPResponse {
    responseStatus  :: Int
  , responseHeaders :: [(S.ByteString, S.ByteString)]
  , resposeBody    :: S.ByteString
} deriving ( Eq, Show )

Examples

Some examples to help you get started.

Remember that everything is just sugar for constructing the HTTPRequest type and calling run on it to convert it to a IO HttpResponse.

{-# LANGUAGE OverloadedStrings #-}
module Example

import qualified          Network.HTTP.Dispatch as Dispatch

response :: IO Dispatch.HttpResponse
response = http request where reqeuest = get "http://google.com"

If you have any questions comments or feedback let me know owain@owainlewis.com

About

A high level HTTP client for Haskell that focuses on ease of use

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published