Ooops,
I forget : you also need to set the "equals" mode when routing to
fooListFinder, otherwise this route will catch the "garbage" URLs.
Best regards,
Thierry Boileau
Hello Stokes,
The routing mechanism is based on Template objects
(http://www.restlet.org/documentation/1.0/api/index.html?org/restlet/util/Template.html)
and Variable objects.
When defining a "route" with the "attach" method, a Template object is
created and then associated with this "route". This Template object is
in charge of parsing the requested URI and give it a score according
to some attributes. then the Router can compare the score of each
route defined and choose the one it prefers ([1]).
The way the Template object assigns a score can be customized with the
following modes :
- MODE_START_WITH (default)
- MODE_EQUALS
In order to solve your problem, you can use the "equals" mode :
//Define routing to FooListFinder
component.getDefaultHost().attach("/foos", <c>);
//Define routing to FooFinder
Route route =
component.getDefaultHost().attach("/foos/{fooid}", <FooFinder>);
route.getTemplate().setMatchingMode(Template.MODE_EQUALS);
route =
component.getDefaultHost().attach("/foos/{fooid}?{fooQuery}", ,
<FooFinder>);
route.getTemplate().setMatchingMode(Template.MODE_EQUALS);
//In this case, the variable "fooQuery" is redefined : it's a
query variable, and it is not required (in order to allow such URIs :
/foos/123?).
Variable variable = new Variable(Variable.TYPE_URI_QUERY, "",
false, false);
route.getTemplate().getVariables().put("fooQuery", variable);
I hope this helps you.
Best regards,
Thierry Boileau
PS :
[1] 6 modes are available :
* Best match (default)
* First match
* Last match
* Random match
* Round robin
* Custom
If I have a router with two Restlets attached as follows:
/foos ==> FooListFinder
/foos/{fooId} ==> FooFinder
... then, as expected, these request route as follows:
/foos --routes to--> FooListFinder
/foos?somearg=true --routes to--> FooListFinder
/foos/123 --routes to--> FooFinder
/foos/123?someotherarg=456 --routes to--> FooFinder
All of that is good.
But as a side-effect, I get these that I _don't_ want:
/foos/123/garbage --routes to--> FooFinder
/foos/123/more/garbage --routes to--> FooFinder
Any suggestions for how to prevent these last two? I need to handle
this at the
framework/router level, so that the Finder implementations aren't
concerned.
In my case my API is very particular about syntax, so I want the last
two
requests above to result in an error page (400).
Thanks,
Stokes.