REST, Routing & the beauty of MR Controller
What is REST?
REST stands for Representational State Trasfer an important concept in REST is the existence of resources (sources of specific information), each of which is referenced with a global identifier (e.g., a URI in HTTP).
How does it work?
REST take advantage of HTTP methods such as POST, GET, PUT and DELETE and translate the request as CREATE, READ, UPDATE, DELETE (CRUD) operation associated with database technologies.
| HTTP | CRUD |
|---|---|
| POST | Create, Update, Delete |
| GET | Read |
| PUT | Create, Overwrite/Replace |
| DELETE | Delete |
REST application might define resources URI such as:
http://example.com/albums
http://example.com/albums/{id}
http://example.com/albums/{id}/slideshow
and client code would look something like this:
Resource userResource = new Resource('http://example.com/users/001');
userResource.delete();
It is simple enough, right?
RESTful Castle
REST needed URI to begin with; now if you are assigned to design a server side code for that what are you gonna do? Well, you simple need an URL Rewrite tools to save day, don’t you? So what does URL Rewrite tools do? Simply it would intercept incoming HTTP request and route to relevant destination (.php, .cgi, .aspx, .asmx scripts etc). It is pretty trivial to do it on apache web server:
- Make sure mod_urlrewrite is enabled
- define a few rules in .htaccess (hmm, regex not so funny)
[ControllerDetails(Area="admin")]
public class UsersController : Controller
{
public void Index()
{
}
}
Notice the use of ControllerDetails attribute which usually allow you to tell MonoRail how a controller can be found. The important part of ControllerDetails above is Area = “admin” which is very flexible and that mean you can burried a controller down as deep as you want it to be.
Is that mean I can have a controller defined and it will generate URI like this?
http://example.com/albums
http://example.com/albums/{id}
http://example.com/albums/{id}/slideshow
With controller alone? you basically can’t do, because controller generated URI in the form /area/controller/action.rails?id={id} to do a nice RESTful like URI you need another tool similar to URL Rewrite lucky enough MR got a build-in tool for that it located here Castle.MonoRail.Framework.Routing … going to talk more in the future.
Limitation & Workaround
* Public Access
http://example.com/albums
http://example.com/albums/{id}
http://example.com/albums/{id}/slideshow
* Authorization Access
http://example.com/users/albums
http://example.com/users/albums/{id}
http://example.com/users/albums/{id}/slideshow
Look at the screenshot bellow:

and you say; hell YEAH that neat right; now compile and run the test site. Navigate to /album/index.rails work unfortunately navigate to /users/albums/index.rails will cause MR to throw an exception say it can’t find Area & Controller specified.
What the hell ??? the truth is MR register a controller using class name as a key I believe it run from the top namespace first which mean Basic.Web.Controllers.AlbumController got register first so when it walk into Basic.Web.Controllers.Users.AlbumController it just skip that controller.
To work around this problem against thank to ControllerDetailsAttribute which allow us to name a controller free from Controller class. How are you going to do that? well rename /users/AlbumController.cs to /users/WhatTheF_CKAlbumController.cs and boom it done.
[ControllerDetails("album", Area="users")]
public class WhatTheF_CKAlbumController{
... same code old code
}
Get lost? probably :) but don’t worry I am going to give a slow version in my C# lecturing session and if you are interested to walkin and listen up just subscribe to my google calendar.
Until then have a good weekend.

[...] a comment » In previous post I was talking about the beauty of MR Controller which I also mention about Routing feature of Castle. Today I am going to walk you through basic [...]
Castle Routing Module « Chorn Sokun’s Weblog
September 24, 2008 at 11:09 pm