加入两个Network.Wai.Application

时间:2016-10-03 14:59:50

标签: haskell servant haskell-wai

我分别对json api和静态文件服务使用servantNetwork.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来做同样的事情?

1 个答案:

答案 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