合并两个 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.

它应该可以工作