加入两个 Network.Wai.Application
Join two Network.Wai.Application
我正在使用 servant
和 Network.Wai.Application.Static
分别用于 json api 和静态文件服务。我想加入这两个 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 来做同样的事情?
我在 #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
我正在使用 servant
和 Network.Wai.Application.Static
分别用于 json api 和静态文件服务。我想加入这两个 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 来做同样的事情?
我在 #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