2016-10-03 55 views
1

我对json api和静态文件服务分别使用servantNetwork.Wai.Application.Static。我想加入这两个Application,以便如果staticApp无法投放,请求应转至jsonApp加入两个Network.Wai.Application

我试着找出并了解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可以用来做同样的事情?

回答

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