我分别对json api和静态文件服务使用servant
和Network.Wai.Application.Static
。我想加入这两个Application,如果staticApp
无法投放,请求请转到jsonApp
。
我尝试了解并了解websocketsOr
如何做到这一点。WebsocketsOr
我终于写道了:
app :: NW.Application -> NW.Application -> NW.Application
app staticApp apiApp req respond =
staticApp req (\ response ->
do
if (Status.statusCode . NW.responseStatus $ response) < 300
then respond response
else apiApp req respond)
但似乎有人(wai本身)会做到这一点,处理许多可能的情况......但我无法找到。
我缺少什么边缘情况(异常??)以及我可以使用其他api来做同样的事情?
答案 0 :(得分:1)
我在#servant
频道上问了这个问题,alpounet
告诉我servant Raw
允许我们自己的Application
处理程序。他们甚至还有一个serveDirectory
api:)
import qualified Servant as S
import Servant ((:>), (:<|>))
type JobApi = "job" :> "status" :> S.Capture "id" ST.JobId :> S.Get '[S.JSON] ST.JobStatus
:<|> "job" :> S.ReqBody '[S.JSON] ST.JobPostBody :> S.Post '[S.JSON] ST.JobId
:<|> "job" :> S.Capture "id" ST.JobId :> S.Get '[S.JSON] ST.JobResult
:<|> S.Raw
serverRouter :: ST.Server -> S.Server JobApi
serverRouter server = statusGet
S.:<|> jobPost
S.:<|> jobGet
S.:<|> S.serveDirectory "assets"
where
-- ... so on