合并两个 Servant Server
Combine two Servant Servers
根据 Servant 的手册https://haskell-servant.readthedocs.io/en/master/tutorial/Server.html可以这样创建一个非常简单的服务器:
type UserAPI1 = "users" :> Get '[JSON] [User]
server1 :: Server UserAPI1
server1 = return users1
userAPI :: Proxy UserAPI1
userAPI = Proxy
我注意到,我可以将 API 部分分开,然后再将它们组合在一起,例如
type ClientAPI =
"users" :> Get '[HTML] (Html ())
type ServerAPI =
"users" :> Get '[JSON] [User]
-- works fine
type API = ("api" :> ServerAPI) :<|> ClientAPI
我可以对服务器值做同样的事情吗?我找不到将两个 "servers" 连接在一起的简单方法:
clientAPI :: Server ClientAPI
clientAPI = usersView
serverAPI :: Server ServerAPI
serverAPI = fetchUsers
api :: Server API
-- doesn't work - is there a way to combine two servers together ?
api = clientAPI + serverAPI
是的,您用来在类型级别组合不同 API 路由的 (:<|>)
组合器也适用于组合处理程序的值级别。
见Hackage docs and Servant tutorial
因此只需将 api
中的 +
替换为 <|>
即可。
编辑:除了顺序很重要。代表您的服务器的值中的处理程序必须与类型级别 API 声明中的不同路由的顺序相同。所以如果你定义 api = serverAPI <|> clientAPI
.
它应该可以工作
根据 Servant 的手册https://haskell-servant.readthedocs.io/en/master/tutorial/Server.html可以这样创建一个非常简单的服务器:
type UserAPI1 = "users" :> Get '[JSON] [User]
server1 :: Server UserAPI1
server1 = return users1
userAPI :: Proxy UserAPI1
userAPI = Proxy
我注意到,我可以将 API 部分分开,然后再将它们组合在一起,例如
type ClientAPI =
"users" :> Get '[HTML] (Html ())
type ServerAPI =
"users" :> Get '[JSON] [User]
-- works fine
type API = ("api" :> ServerAPI) :<|> ClientAPI
我可以对服务器值做同样的事情吗?我找不到将两个 "servers" 连接在一起的简单方法:
clientAPI :: Server ClientAPI
clientAPI = usersView
serverAPI :: Server ServerAPI
serverAPI = fetchUsers
api :: Server API
-- doesn't work - is there a way to combine two servers together ?
api = clientAPI + serverAPI
是的,您用来在类型级别组合不同 API 路由的 (:<|>)
组合器也适用于组合处理程序的值级别。
见Hackage docs and Servant tutorial
因此只需将 api
中的 +
替换为 <|>
即可。
编辑:除了顺序很重要。代表您的服务器的值中的处理程序必须与类型级别 API 声明中的不同路由的顺序相同。所以如果你定义 api = serverAPI <|> clientAPI
.