const classafBedSheet::Route
sys::Obj afBedSheet::Route
Matches uri paths to request handler methods, converting any remaining path segments into method arguments. Use *
to capture (non-greedy) method arguments, **
to capture all remaining path segments and ***
to capture the remaining url Examples:
glob pattern uri arguments ----------------------------------------------------- /user/* --> /user/ => "" /user/* --> /user/42 => "42" /user/* --> /user/42/dee => no match /user/*/* --> /user/ => no match /user/*/* --> /user/42 => no match /user/*/* --> /user/42/dee => "42", "dee" /user/** --> /user/ => "" /user/** --> /user/42 => "42" /user/** --> /user/42/dee => "42", "dee" /user/*** --> /user/ => "" /user/*** --> /user/42 => "42" /user/*** --> /user/42/dee => "42/dee"
Method arguments with default values are mapped to optional path segments. Use **
to capture optional segments in the uri. Example:
using afBedSheet using afIoc class AppModule { @Contribute static Void contributeRoutes(OrderedConfig conf) { conf.add(Route(`/hello/**`, HelloPage#hello)) } } class HelloPage { Text hello(Str name, Int iq := 666) { return Text.fromPlain("Hello! I'm $name and I have an IQ of $iq!") } } '/hello/Traci/69' => helloPage.hello("Traci", 69) => "Hello! I'm Traci and I have an IQ of 69" 'hello/Luci' => helloPage.hello("Luci") => "Hello! I'm Luci and I have an IQ of 666" 'dude/' => no match 'hello/' => no match 'hello/1/2/3 => no match
Path segments are converted to Objs via the ValueEncoder service.
TIP: Contribute
ValueEncoders
to convert path segments into Entities. BedSheet can then call handlers with real Entities, not just str IDs!
Parameters of type Str[]
are capture all parameters and match the remaining uri (split on /
).
Request uri's (for matching purposes) are treated as case-insensitive. In the example above, both
hello/Luci
andHELLO/Luci
would be matched.
Use ?
to optional match the last character. Use to optionally match a trailing slash. e.g.
glob uri ----------------------------- /index/? --> /index => match /index/? --> /index/ => match vs /index/ --> /index => no match /index --> /index/ => no match
If a handler class is a service, it is obtained from the IoC registry, otherwise it is autobuilt. If the class is const
, the instance is cached for future use.
Note: There is no special handling for nullable types in handler method arguments as BedSheet can not determine when null
is a suitable replacement for an empty str. Instead contribute a ValueEncoder or use default values.
- handler
const Method handler
Method handler for this route.
- httpMethod
const Str httpMethod
HTTP method used for this route
- makeFromGlob
new makeFromGlob(Uri glob, Method handler, Str httpMethod := "GET")
Make a Route that matches on the given glob pattern.
glob
must start with a slash "/"httpMethod
may be a glob. Example, use "*" to match all methods.- makeFromRegex
new makeFromRegex(Regex uriRegex, Method handler, Str httpMethod := "GET", Bool matchRemaining := false)
For hardcore users; make a Route from a regex. Capture groups are used to match arguments. Example:
Route(Regex<|(?i)^\/index\/(.*?)$|>, #foo, "GET", true) -> Route(`/index/**`)
Set
matchRemaining
totrue
to have the last capture group mimic the glob**
operator, splitting on "/" to match all remaining segments.- routeRegex
const Regex routeRegex
The uri regex this route matches.
- toStr
virtual override Str toStr()