В эти дни нередко требуется вернуть файл (скажем, index.html
) из бэкэнд, если запрошенный маршрут не соответствует существующей конечной точке API или другому статическому ресурсу. Это особенно удобно при использовании react-router
и browserHistory
.Маршрутизация общего доступа или по умолчанию
Я немного тупик относительно того, как я могу приблизиться к этому с Слуги. Я действительно задавался вопросом, если перехватывать 404-х может быть путь, но тогда, конечно, иногда API нужно будет законно выдавать 404. Вот такие вещи я использую для экспериментов:
data Wombat = Wombat
{ id :: Int
, name :: String
} deriving (Eq, Show, Generic)
instance ToJSON Wombat
wombatStore :: [Wombat]
wombatStore =
[ Wombat 0 "Gertrude"
, Wombat 1 "Horace"
, Wombat 2 "Maisie"
, Wombat 3 "Julius"
]
wombats :: Handler [Wombat]
wombats = return wombatStore
wombat :: Int -> Handler Wombat
wombat wid = do
case find (\w -> Main.id w == wid) wombatStore of
Just x -> return x
Nothing -> throwE err404
type API =
"api" :> "wombats" :> Get '[JSON] [Wombat] :<|>
"api" :> "wombats" :> Capture "id" Int :> Get '[JSON] Wombat :<|>
Raw
api :: Proxy API
api = Proxy
server :: Server API
server = wombats
:<|> wombat
:<|> serveDirectory "static"
app :: Application
app = serve api server
main :: IO()
main = run 3000 app
Я бы любите видеть пример того, как я могу добавить добавление маршрута по умолчанию, который отправляет ответ HTML, если запрос не соответствует конечной точке API или чему-либо в статическом каталоге. Toy repo here.
Большое спасибо, это действительно полезно! –