git.iko.soy/typeable/servant
on master help sign in
Document Raw's behaviour when composing APIs
commit29aa10176db51bdd79bcf16fdf0fb7f30333732a authorbChiquet <contrib-servant@binarytrove.com> dateWed 29 Sep 2021, 10:11 (5 years ago) parentbf160cc
1 file changed+27
doc/tutorial/ApiType.lhs+27
doc/tutorial/ApiType.lhs+27
@@ -389,3 +389,30 @@ One example for this is if you want to serve a directory of static files along
389389with the rest of your API. But you can plug in everything that is an
390390`Application`, e.g. a whole web application written in any of the web
391391frameworks that support `wai`.
392+
393+Be mindful! This library works by pattern-matching the different routes that are
394+composed using `:<|>`. `Raw`, as an escape hatch, matches any route that hasn't
395+been matched by previous patterns. Therefore, any subsequent route will be silently
396+ignored.
397+
398+``` haskell
399+type UserAPI14 = Raw
400+ :<|> "users" :> Get '[JSON] [User]
401+ -- In this situation, the /users endpoint
402+ -- will not be reachable because the Raw
403+ -- endpoint matches requests before
404+```
405+A simple way to avoid this pitfall is to either use `Raw` as the last
406+definition, or to always have it under a directory.
407+
408+``` haskell
409+type UserAPI15 = "files" :> Raw
410+ -- The raw endpoint is under a directory,
411+ -- so it won't match /users.
412+ :<|> "users" :> Get '[JSON] [User]
413+
414+type UserAPI16 = "users" :> Get '[JSON] [User]
415+ :<|> Raw
416+ -- The Raw endpoint is matched last, so
417+ -- it won't overlap another endpoint.
418+```