const classafBedSheet::Route

sys::Obj
  afBedSheet::Route

Matches uri paths to 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 and
  • HELLO/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

Source

const Method handler

Method handler for this route.

httpMethod

Source

const Str httpMethod

HTTP method used for this route

makeFromGlob

Source

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

Source

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 to true to have the last capture group mimic the glob ** operator, splitting on "/" to match all remaining segments.

routeRegex

Source

const Regex routeRegex

The uri regex this route matches.

toStr

Source

virtual override Str toStr()