servant-client
Automatic derivation of querying functions for servant
| LTS Haskell 24.17: | 0.20.3.0@rev:2 | 
| Stackage Nightly 2025-10-31: | 0.20.3.0@rev:2 | 
| Latest on Hackage: | 0.20.3.0@rev:2 | 
servant-client-0.20.3.0@sha256:ad0fd5ee9ff8315e047b169911d32f9403201c313fa4a749cca80872ac4a2e06,5839Module documentation for 0.20.3.0
- 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 (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.
Package versions follow the Package Versioning Policy: in A.B.C, bumps to either A or B represent major versions.
0.20.3.0
- 
Server-sent events (SSE) for client-side #1811 Implement Server-sent events (SSE) for the Servant client using a new combinator “ServerSentEvents”. The raw event messages, accumulated events and JSON-processed events can be exposed. 
- 
Integrate MultiVerb #1766 #1804 Expose MultiVerb, a more ergonomic way of defining endpoints that return many kinds of responses. Read the cookbook https://docs.servant.dev/en/master/cookbook/multiverb/MultiVerb.html 
- 
Add public re-export of renderCurlBasePath lens #1706 
- 
Remove GHC <= 8.10.7 from the support window #1778 
- 
Add Servant.API.Range type #1805 
- 
Add Host API combinator #1800 Adding a Host combinator allows servant users to select APIs according to the Host header provided by clients. 
0.20.2
- 
Client Middleware #1720 Clients now support real middleware of type (Request -> ClientM Response) -> Request -> ClientM Responsewhich can be configured inClientEnv. This allows access to raw request and response data. It can also be used to control how/when/if actual requests are performed. Middleware can be chained with function compositionmid1 . mid2 . mid3.
0.20
- 
Escape special chars in QueryParams. #1584 #1597 Escape special chars in QueryParam ( :@&=+$) in servant-client. Note that this mean binary data will not work as is, and so reverts the functionality in #1432.
- 
Handle Cookies correctly for RunStreamingClient #1605 #1606 Makes performWithStreamingRequesttake into consideration the CookieJar, which it previously didn’t.
- 
Fix the handling of multiple headers with the same name. #1666 servant-client no longer concatenates the values of response headers with the same name. This fixes an issue with parsing multiple Set-Cookieheaders.
0.19
Significant changes
- Drop support for GHC < 8.6.
- Support GHC 9.0 (GHC 9.2 should work as well, but isn’t fully tested yet).
- Support Aeson 2 (#1475), which fixes a DOS vulnerability related to hash collisions.
- Add NamedRoutescombinator, making support for records first-class in Servant (#1388).
- Add custom type errors for partially applied combinators (#1289, #1486).
- servant-client / servant-client-core / servant-http-streams: Fix erroneous behavior, where only 2XX status codes would be considered successful, irrelevant of the status parameter specified by the verb combinator. (#1469)
- servant-client / servant-client-core: Fix Showinstance forServant.Client.Core.Request.
- servant-client / servant-client-core: Allow passing arbitrary binary data in Query parameters. (#1432).
Other changes
- Various version bumps.
0.18.3
Significant changes
- Add response header support to UVerb (#1420)
Other changes
- Support GHC-9.0.1.
- Bump bytestring,hspec,http-clientandQuickCheckdependencies.
0.18.2
Significant changes
- Support Fragmentcombinator.
0.18.1
Significant changes
- Union verbs
Other changes
- Bump “tested-with” ghc versions
0.18
Significant changes
- Support for ghc8.8 (#1318, #1326, #1327)
0.17
Significant changes
- 
Add NoContentVerb #1028 #1219 #1228 The NoContentAPI endpoints should now useNoContentVerbcombinator. The API type changes are usually of the kind- :<|> PostNoContent '[JSON] NoContent + :<|> PostNoContenti.e. one doesn’t need to specify the content-type anymore. There is no content. 
- 
Capturecan beLenient#1155 #1156You can specify a lenient capture as :<|> "capture-lenient" :> Capture' '[Lenient] "foo" Int :> GETwhich will make the capture always succeed. Handlers will be of the type Either String CapturedType, whereLeft errrepresents the possible parse failure.
- 
servant-client Added a function to create Client.Request in ClientEnv #1213 #1255 The new member makeClientRequestofClientEnvis used to createhttp-clientRequestfromservant-client-coreRequest. This functionality can be used for example to set dynamic timeouts for each request.
Other changes
- 
servant-client servant-client-core servant-http-streams Fix Verb with headers checking content type differently #1200 #1204 For Verbs with responseHeaders, the implementation didn’t check for the content-type of the response. Now it does.
- 
servant-client servant-http-streams HasClientinstance forStreamwithHeaders#1170 #1197
- 
servant-client Redact the authorization header in Show and exceptions #1238 
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 request- Streamendpoints.
- Servant.Clientis run by direct- runClientM :: ClientM a -> ClientEnv -> IO (Either ServantError a)
- Servant.Client.Streamingcan request- Streamendpoints.
- Servant.Client.Streamingis used by CPSised- withClientM :: 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, 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)
- Req- reqPathfield changed from- Stringto- BS.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 an- Eqinstance now.
0.6
- clientno longer takes- BaseUrland- Managerarguments. Instead, each function returned by- clientrequires these two arguments.
0.5
- Use the textpackage instead ofString.
- Support for the HttpVersion,IsSecure,RemoteHostandVaultcombinators
- Added support for pathonBaseUrl.
- clientnow takes an explicit- Managerargument.
- 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 like- Get,- Post,- Put, and- Patchand 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
