servant-rawm-0.2.0.2: example/Client.hs
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as LBS
import Data.Monoid ((<>))
import Data.Proxy (Proxy(Proxy))
import Network.HTTP.Client (Response, defaultManagerSettings, newManager, responseBody)
import Network.HTTP.Media (MediaType)
import Network.HTTP.Types (Header, Method, methodGet)
import Servant.API ((:<|>)((:<|>)))
import Servant.Client
(BaseUrl(BaseUrl), ClientEnv(ClientEnv), ClientM, Scheme(Http),
client, runClientM)
import Servant.Common.Req (Req, appendToPath)
import Servant.RawM ()
import Api (Api, port)
-----------------------------------------
-- Clients generated by servant-client --
-----------------------------------------
otherEndpoint1 :: ClientM Int
getFile' :: Method -> (Req -> Req) -> ClientM (Int, ByteString, MediaType, [Header], Response ByteString)
otherEndpoint2 :: ClientM Int
otherEndpoint1 :<|> getFile' :<|> otherEndpoint2 = client (Proxy :: Proxy Api)
getFile :: String -> ClientM ByteString
getFile filePath = do
(_, _, _, _, resp) <- getFile' methodGet $ \req -> appendToPath filePath req
pure $ responseBody resp
----------
-- Main --
----------
main :: IO ()
main = do
manager <- newManager defaultManagerSettings
let clientEnv = ClientEnv manager baseUrl
eitherRes <- runClientM (getFile "foo.txt") clientEnv
case eitherRes of
Left servantErr -> putStrLn $ "Got a ServantErr: " <> show servantErr
Right fileContents -> do
putStrLn "Successfully got file ./example/files/foo.txt:\n"
LBS.putStr fileContents
baseUrl :: BaseUrl
baseUrl = BaseUrl Http "localhost" port ""