Сопоставление URL-адресов Grails, можно ли префикс сопоставления URL-адресов?

Так, например, скажем, у меня есть API в веб-приложении, и я хочу использовать те же контроллеры и действия в API, что и остальная часть веб-приложения.

В моем файле сопоставления URL-адресов у меня есть

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

и у меня также есть такое отображение:

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

Теперь вопрос в том, могу ли я как-то добавить префикс URL-адреса API к URL-адресу блога, чтобы я мог извлечь выгоду из переменных $year, $month, $day? таким образом, чтобы GET-запрос по следующему URL-адресу был действительным:

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

или я вынужден вместо этого выполнить следующий запрос?

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

Нужна помощь от ГУРУ сопоставления URL-адресов или отличного МАСТЕРА манипулирования сопоставлениями URL-адресов во время выполнения :)

Мне нужно решение, которое может повторно использовать существующие сопоставления urmapping, отличные от API, вместо того, чтобы повторно объявлять их с путем API в качестве префикса.


person netbrain    schedule 12.05.2011    source источник


Ответы (3)


Вы можете отключить ApiController от параметров API, а затем перенаправить на контроллер блога. Например:

"/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}"))
    }
}

Контроллер API имеет доступ к версии и параметрам apiKey и передает остальные параметры для обработки с помощью UrlMapping контроллера блога.

person ataylor    schedule 12.05.2011
comment
это вызовет перенаправление 302 для всех вызовов API :( не очень хорошо... но, тем не менее, это сработает... - person netbrain; 12.05.2011
comment
Обновлен мой ответ, чтобы сделать внутреннюю переадресацию, а не перенаправление 302. - person ataylor; 13.05.2011
comment
Выглядит хорошо, буду тестировать. Однако было бы лучше, если бы я мог оставить дополнительный класс ApiController вне поля зрения, а также оператор вперед. Но это однозначное решение! Спасибо! - person netbrain; 13.05.2011
comment
Вы случайно не знаете, почему фильтры запускаются дважды при выполнении внутренней переадресации. это ожидаемое поведение? - person netbrain; 31.05.2011

Я думаю, вы хотите использовать встроенные переменные. Проверьте ссылку на сопоставление URL-адресов: http://grails.org/doc/latest/guide/single.html#6.4 Сопоставления URL

просто добавьте следующее сопоставление:

static mappings = {
   "/api/$version/$apiKey/$controller/$year/$month/$day/$action"()
} 

теперь вы можете использовать этот URL, например:

http://localhost:8080/api/0.1/bs23mk4m2n4k/blog/2001/01/05/list

теперь вы будете перенаправлены на действие списка в контроллере блога. там вы можете использовать параметры для отображения параметров из URL-адреса (как определено в сопоставлении).

ex.

params.version
person mjspier    schedule 12.05.2011
comment
Мне нужно решение, которое может повторно использовать существующие сопоставления urmapping, отличные от API, вместо того, чтобы повторно объявлять их с путем API в качестве префикса. - person netbrain; 12.05.2011
comment
в порядке. пропустил это в вашем вопросе. но почему проблематично объявить и это сопоставление? в чем преимущество использования существующих сопоставлений? - person mjspier; 13.05.2011
comment
но у вас есть два разных шаблона URL, поэтому необходимы два сопоставления. они не идентичны. Сколько сопоставлений URL-адресов вы объявили тогда. Может быть, у меня возникнут проблемы, когда вы опубликуете больше своих URL-адресов. - person mjspier; 13.05.2011
comment
Посмотрите на ответ ataylors. Его ответ делает именно то, что я хочу. С его решением выполняется как /api urlmapping, так и нормальное отображение, без необходимости объявлять какие-либо дополнительные /api urlmappings. Единственное, что отрицательно с его решением, это то, что он использует вызов forward(), который у меня был мои разногласия с прошлым. Первоначально я хотел, чтобы сопоставления URL-адресов были умными и понимали, что сопоставление URL-адресов /api должно иметь префикс для всех сопоставлений URL-адресов, отличных от API, эффективно создавая то, что вы описали в своем решении. Однако это не должно делаться вручную. - person netbrain; 13.05.2011