Присоединяйтесь к двум 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
Другие вопросы по тегам