Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grails urlmappings, can one prefix urlmappings?

So for instance, say i have an API on a webapp, and i wish to use the same controllers and actions in the API as the rest of the webapp.

In my urlmappings file i have

"/api/$version/$apiKey/$controller/$acion/$id?"

and i also have a mapping like this:

"/blog/$year/$month/$day/$action" {
   controller = 'blog'
 }

Now the question is, can i somehow prefix the api urlmapping to the blog urlmapping so i can benefit from the $year, $month, $day variables? in such a way that a GET request to the following url would be valid:

GET /api/0.1/bs23mk4m2n4k/blog/2001/01/05/list

or am i forced to do the following request instead?

GET /api/0.1/bs23mk4m2n4k/blog/list?year=2004&month=01&day=05

Need help from an urlmappings GURU or a groovy runtime urlmappings maniuplation WIZARD :)

I want a solution that can reuse existing non-api urmappings, instead of having to redeclare them with the api path as a prefix.

like image 247
netbrain Avatar asked Nov 05 '22 22:11

netbrain


1 Answers

You could have an ApiController strip off the api parameters, then redirect to the blog controller. For example:

"/api/$version/$apiKey/$rest**" {
     controller:'api'
     action:'default'
}


import org.codehaus.groovy.grails.web.util.WebUtils
class ApiController {
    def grailsUrlMappingsHolder

    def default = {
        // validate apiKey, etc
        WebUtils.forwardRequestForUrlMappingInfo(request, response, grailsUrlMappingsHolder.match("/${params.rest}"))
    }
}

The API controller has access to the version and apiKey params, and passes on the rest of the params to be processed by the blog controller's UrlMapping.

like image 73
ataylor Avatar answered Nov 15 '22 05:11

ataylor