Simpler API
The API below is rather low-level. The
Network.HTTP.Simple
module provides a higher-level API with built-in support for things
like JSON request and response bodies. For most users, this will be an
easier place to start. You can read the tutorial at:
https://haskell-lang.org/library/http-client
Lower-level API
This module contains everything you need to initiate HTTP connections.
If you want a simple interface based on URLs, you can use
simpleHttp. If you want raw power,
http is the
underlying workhorse of this package. Some examples:
-- Just download an HTML document and print it.
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
main = simpleHttp "http://www.haskell.org/" >>= L.putStr
This example uses interleaved IO to write the response body to a file
in constant memory space.
import Data.Conduit.Binary (sinkFile) -- Exported from the package conduit-extra
import Network.HTTP.Conduit
import Conduit (runConduit, (.|))
import Control.Monad.Trans.Resource (runResourceT)
main :: IO ()
main = do
request <- parseRequest "http://google.com/"
manager <- newManager tlsManagerSettings
runResourceT $ do
response <- http request manager
runConduit $ responseBody response .| sinkFile "google.html"
The following headers are automatically set by this module, and should
not be added to
requestHeaders:
- Cookie
- Content-Length
- Transfer-Encoding
Note: In previous versions, the Host header would be set by this
module in all cases. Starting from 1.6.1, if a Host header is present
in
requestHeaders, it will be used in place of the header
this module would have generated. This can be useful for calling a
server which utilizes virtual hosting.
Use
cookieJar If you want to supply cookies with your request:
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Conduit
import Network
import Data.Time.Clock
import Data.Time.Calendar
import qualified Control.Exception as E
import Network.HTTP.Types.Status (statusCode)
past :: UTCTime
past = UTCTime (ModifiedJulianDay 56200) (secondsToDiffTime 0)
future :: UTCTime
future = UTCTime (ModifiedJulianDay 562000) (secondsToDiffTime 0)
cookie :: Cookie
cookie = Cookie { cookie_name = "password_hash"
, cookie_value = "abf472c35f8297fbcabf2911230001234fd2"
, cookie_expiry_time = future
, cookie_domain = "example.com"
, cookie_path = "/"
, cookie_creation_time = past
, cookie_last_access_time = past
, cookie_persistent = False
, cookie_host_only = False
, cookie_secure_only = False
, cookie_http_only = False
}
main = do
request' <- parseRequest "http://example.com/secret-page"
manager <- newManager tlsManagerSettings
let request = request' { cookieJar = Just $ createCookieJar [cookie] }
fmap Just (httpLbs request manager) `E.catch`
(\ex -> case ex of
HttpExceptionRequest _ (StatusCodeException res _) ->
if statusCode (responseStatus res) == 403
then (putStrLn "login failed" >> return Nothing)
else return Nothing
_ -> E.throw ex)
Cookies are implemented according to RFC 6265.
Note that by default, the functions in this package will throw
exceptions for non-2xx status codes. If you would like to avoid this,
you should use
checkStatus, e.g.:
import Data.Conduit.Binary (sinkFile)
import Network.HTTP.Conduit
import qualified Data.Conduit as C
import Network
main :: IO ()
main = do
request' <- parseRequest "http://www.yesodweb.com/does-not-exist"
let request = request' { checkStatus = \_ _ _ -> Nothing }
manager <- newManager tlsManagerSettings
res <- httpLbs request manager
print res
By default, when connecting to websites using HTTPS, functions in this
package will throw an exception if the TLS certificate doesn't
validate. To continue the HTTPS transaction even if the TLS cerficate
validation fails, you should use
mkManagerSetttings as
follows:
import Network.Connection (TLSSettings (..))
import Network.HTTP.Conduit
main :: IO ()
main = do
request <- parseRequest "https://github.com/"
let settings = mkManagerSettings (TLSSettingsSimple True False False) Nothing
manager <- newManager settings
res <- httpLbs request manager
print res
For more information, please be sure to read the documentation in the
Network.HTTP.Client module.