servant-client
Automatic derivation of querying functions for servant
| Version on this page: | 0.16.0.1 |
| LTS Haskell 24.16: | 0.20.3.0@rev:2 |
| Stackage Nightly 2025-10-24: | 0.20.3.0@rev:2 |
| Latest on Hackage: | 0.20.3.0@rev:2 |
servant-client-0.16.0.1@sha256:f970ad4e927530b77f52b99a175c85cfdcd1ef988083d56a1f68c6a3dafe8d51,4376Module documentation for 0.16.0.1
- Servant
servant-client

This library lets you automatically derive Haskell functions that let you query each endpoint of a servant webservice.
Example
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import Data.Proxy
import Data.Text
import Network.HTTP.Client (newManager, defaultManagerSettings)
import Servant.API
import Servant.Client
type Book = Text
type MyApi = "books" :> Get '[JSON] [Book] -- GET /books
:<|> "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book -- POST /books
myApi :: Proxy MyApi
myApi = Proxy
-- 'client' allows you to produce operations to query an API from a client.
postNewBook :: Book -> ClientM Book
getAllBooks :: ClientM [Book]
(getAllBooks :<|> postNewBook) = client myApi
main :: IO ()
main = do
manager' <- newManager defaultManagerSettings
res <- runClientM getAllBooks (mkClientEnv manager' (BaseUrl Http "localhost" 8081 ""))
case res of
Left err -> putStrLn $ "Error: " ++ show err
Right books -> print books
Changes
The latest version of this document is on GitHub.
Changelog for servant package contains significant entries for all core packages.
0.16.0.1
- Allow
base-compat-0.11
0.16
-
Rename
ServantErrortoClientError,ServantErrtoServerError#1131 -
servant-client-core Rearrange modules. No more
Internalmodules, whole API is versioned. #1130 -
servant-client-core
RequestBodyis now= RequestBodyLBS LBS.ByteString | RequestBodyBS BS.ByteString | RequestBodySource (SourceIO LBS.ByteString)i.e. no more replicates
http-clients API. #1117 -
servant-client-core Keep structured exceptions in
ConnectionErrorconstructor ofClientError#1115-| ConnectionError Text +| ConnectionError SomeException -
servant-client-core Preserve failing request in
FailureResponseconstructor ofClientError#1114-FailureResponse Response +-- | The server returned an error response including the +-- failing request. 'requestPath' includes the 'BaseUrl' and the +-- path of the request. +FailureResponse (RequestF () (BaseUrl, BS.ByteString)) Response -
servant-client Fix (implement)
StreamBodyinstance #1110 -
servant-client Update CookieJar with intermediate request/responses (redirects) #1104
0.15
-
Streaming refactoring. #991 #1076 #1077
The streaming functionality (
Servant.API.Stream) is refactored to useservant’s ownSourceIOtype (seeServant.Types.SourceTdocumentation), which replaces bothStreamGeneratorandResultStreamtypes.New conversion type-classes are
ToSourceIOandFromSourceIO(replacingToStreamGeneratorandBuildFromStream). There are instances for conduit, pipes and machines in new packages: servant-conduit servant-pipes and servant-machines respectively.Writing new framing strategies is simpler. Check existing strategies for examples.
This change shouldn’t affect you, if you don’t use streaming endpoints.
-
servant-client Separate streaming client. #1066
We now have two
http-clientbased clients, inServant.ClientandServant.Client.Streaming.Their API is the same, except for
Servant.Clientcannot requestStreamendpoints.Servant.Clientis run by directrunClientM :: ClientM a -> ClientEnv -> IO (Either ServantError a)Servant.Client.Streamingcan requestStreamendpoints.Servant.Client.Streamingis used by CPSisedwithClientM :: ClientM a -> ClientEnv -> (Either ServantError a -> IO b) -> IO b
To access
Streamendpoints useServant.Client.StreamingwithwithClientM; otherwise you can continue usingServant.ClientwithrunClientM. You can use both too,ClientEnvandBaseUrltypes are same for both.Note:
Servant.Client.Streamingdoesn’t stream non-Streamendpoints. Requesting ordinaryVerbendpoints (e.g.Get) will block until the whole response is received.There is
Servant.Client.Streaming.runClientMfunction, but it has restricted type.NFData aconstraint prevents using it withSourceT,Conduitetc. response types.runClientM :: NFData a => ClientM a -> ClientEnv -> IO (Either ServantError a)This change shouldn’t affect you, if you don’t use streaming endpoints.
-
servant-client-core Add
NFData (GenResponse a)andNFData ServantErrorinstances. #1076
servant-client-core Add aeson and Lift BaseUrl instances
#1037
0.14
-
Streamtakes a status code argument-Stream method framing ctype a +Stream method status framing ctype a -
ToStreamGeneratordefinition changed, so it’s possible to write an instance for conduits.-class ToStreamGenerator f a where - toStreamGenerator :: f a -> StreamGenerator a +class ToStreamGenerator a b | a -> b where + toStreamGenerator :: a -> StreamGenerator b(#959)
-
Added
NoFramingstreaming strategy (#959) -
servant-client-core Add
hoistClienttoHasClient. Just likehoistServerallows us to change the monad in which request handlers of a web application live in, we also havehoistClientfor changing the monad in which client functions live. Read tutorial section for more information. (#936) -
servant-client Add more constructors to
RequestBody, includingRequestBodyStream. Note: we are looking for http-library agnostic API, so the might change again soon. Tell us which constructors are useful for you! (#913)
0.13.0.1
- Support
base-compat-0.10
0.13
- Streaming endpoint support. (#836)
- servant Add
Servant.API.Modifiers(#873) - servant-client Support
http-client’sCookieJar(#897 #883)
0.12.0.1
- Send
Acceptheader. (#858)
0.12
- Factored out into
servant-client-coreall the functionality that was independent of thehttp-clientbackend.
0.11
Other changes
- Path components are escaped (#696)
ReqreqPathfield changed fromStringtoBS.Builder(#696)- Include
Reqin failure errors (#740)
0.10
Breaking changes
There shouldn’t be breaking changes. Released as a part of servant suite.
Other changes
-
Add MonadBase and MonadBaseControl instances for ClientM (#663)
-
client asks for any content-type in Accept contentTypes non-empty list (#615)
-
Add
ClientLikeclass that matches client functions generated usingclientwith client data structure. (#640) -
Allow direct use of ‘RequestBody’ (#661)
0.9.1.1
- Add MonadThrow and MonadCatch instances for ClientM
0.9
- BACKWARDS INCOMPATIBLE:
clientnow returns a ClientM which is a Reader for BasicEnv. BasicEnv comprises the HttpManager and BaseUrl that have had to be passed to each method returned byclient.
0.7.1
- Support GHC 8.0
ServantErrorhas anEqinstance now.
0.6
clientno longer takesBaseUrlandManagerarguments. Instead, each function returned byclientrequires these two arguments.
0.5
- Use the
textpackage instead ofString. - Support for the
HttpVersion,IsSecure,RemoteHostandVaultcombinators - Added support for
pathonBaseUrl. clientnow takes an explicitManagerargument.- Use
http-api-datainstead ofServant.Common.Text - Client functions now consider any 2xx successful.
- Remove matrix params.
- Added support for Basic authentication
- Add generalized authentication support via the
AuthClientDatatype family andAuthenticateReqdata type
0.4.1
- The
HasClientinstance forDelete cts ()now does not care at all about content types provided.
0.4
Deletenow is likeGet,Post,Put, andPatchand returns a response body- Support content-type aware combinators and
Accept/Content-typeheaders - Added a lot of tests
- Support multiple concurrent threads
- Use
ServantErrorto report Errors instead ofString - Make the clients for
Rawendpoints return the wholeResponsevalue (to be able to access response headers for example) - Support for PATCH
- Make () instances expect No Content status code, and not try to decode body.
- Add support for response headers
0.2.2
- Add TLS support
- Add matrix parameter support