Haskell服务的部分反向代理

Haskell服务的部分反向代理,haskell,reverse-proxy,servant,Haskell,Reverse Proxy,Servant,我正在尝试在Haskell中构建一个web服务器,其中部分api用作另一个api的反向代理 如何做到这一点。但它似乎不起作用: type API = "cat" :> Get '[JSON] Cat newtype Cat = Cat { cat :: String } instance ToJSON Cat where toJSON (Cat mew) = object [ "cat" .= mew ] se

我正在尝试在Haskell中构建一个web服务器,其中部分api用作另一个api的反向代理

如何做到这一点。但它似乎不起作用:


type API
    = "cat" :> Get '[JSON] Cat

newtype Cat = Cat { cat :: String }

instance ToJSON Cat where
    toJSON (Cat mew) =
        object [ "cat" .= mew ]

server :: Server API
server = pure (Cat { cat = "mrowl" })

api :: Proxy (API :<|> Raw)
api = Proxy

app :: Manager -> Application
app manager =
    serve api $ server :<|> waiProxyTo forwardRequest defaultOnExc manager

forwardRequest :: Request -> IO WaiProxyResponse
forwardRequest _ =
    pure . WPRProxyDest . ProxyDest "127.0.0.1" $ 4567

startApp :: IO ()
startApp = do
    manager <- newManager defaultManagerSettings
    run 8080 (app manager)

类型API
=“cat”:>获取“[JSON]cat
newtype Cat=Cat{Cat::String}
实例ToJSON Cat在哪里
toJSON(猫喵)=
对象[“猫”。=mew]
服务器::服务器API
服务器=纯(Cat{Cat=“mrowl”})
api::代理(api:Raw)
api=代理
应用程序::管理器->应用程序
应用程序管理器=
服务api$server:waiProxyTo forwardRequest defaultOnExc管理器
forwardRequest::Request->IO WaiProxyResponse
转发请求=
纯净的WPRProxyDest。ProxyDest“127.0.0.1”$4567
startApp::IO()
startApp=do

经理我不完全理解为什么这样做有效,但我是通过模仿工作原理来实现的:

导入服务服务器(ServerT,已标记)
{- ... -}
forwardServer::Manager->ServerT Raw m
forwardServer manager=标记为$waiProxyTo forwardRequest defaultOnExc manager
forwardRequest::Request->IO WaiProxyResponse
转发请求=
纯净的WPRProxyDest。ProxyDest“127.0.0.1”$4567
应用程序::管理器->应用程序
应用程序管理器=
服务api$服务器:(转发服务器管理器)

我想我可能需要以某种方式将
提升服务器
waiProxyTo
结合起来……感谢您解决了这个问题!
    • Couldn't match type ‘Request
                           -> (Response -> IO ResponseReceived) -> IO ResponseReceived’
                     with ‘Tagged Handler Application’
      Expected type: Server (API :<|> Raw)
        Actual type: Handler Cat :<|> Application
    • In the second argument of ‘($)’, namely
        ‘server :<|> waiProxyTo forwardRequest defaultOnExc manager’
      In the expression:
        serve api
          $ server :<|> waiProxyTo forwardRequest defaultOnExc manager
      In an equation for ‘app’:
          app manager
            = serve api
                $ server :<|> waiProxyTo forwardRequest defaultOnExc manager
   |
32 |     serve api $ server :<|> waiProxyTo forwardRequest defaultOnExc manager
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
import Servant.Server (ServerT, Tagged)
{- ... -}
forwardServer :: Manager -> ServerT Raw m
forwardServer manager = Tagged $ waiProxyTo forwardRequest defaultOnExc manager

forwardRequest :: Request -> IO WaiProxyResponse
forwardRequest _ =
    pure . WPRProxyDest . ProxyDest "127.0.0.1" $ 4567

app :: Manager -> Application
app manager =
    serve api $ server :<|> (forwardServer manager)