Haskell服务的部分反向代理
我正在尝试在Haskell中构建一个web服务器,其中部分api用作另一个api的反向代理 如何做到这一点。但它似乎不起作用: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
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)