Присоединяйтесь к двум Network.Wai.Application
Я использую servant
а также Network.Wai.Application.Static
для json api и статического обслуживания файлов соответственно. Я хочу присоединиться к этим двум приложениям, так что если 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)
Но кажется, что кто-то другой (сам Вай) сделал бы это, обрабатывая много возможных случаев. Но я не могу найти.
Какие случаи мне не хватает (исключения??) и какие другие 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