Мне интересно об этом, и это то, с чем я сталкивался раньше и просто работал с кучей построчных сопоставлений.
Скажем, я хочу приложение Grails 3.3 с несколькимиэкран (страницы), используя старое / стандартное отображение:
static mappings = {
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
}
Но тогда я бы также хотел (очень маленькое) отображение стиля API, что-то вроде:
static mappings = {
get "/api/$controller(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
post "/api/$controller"(action:"save", namespace:'api')
put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
patch "/api/$controller/$id"(action:"patch", namespace:'api')
delete "/api/$controller/$id"(action:"delete", namespace:'api')
}
Нормальныйконтроллеры не имеют пространства имен, и я бы хотел, чтобы к ним обращались через стиль по умолчанию grails.Но я бы хотел, чтобы API был доступен (включая обратное сопоставление с использованием createLink () и т. Д., Если это возможно, для простоты.
Я пробовал несколько конфигураций и обнаружил, что следующеепрямое сопоставление (контроллер и действие находятся через URL), но обратное сопоставление всегда устанавливается по умолчанию для ссылки в стиле «/$controller/$action?/$id?(.$format)?» (которую я предпочел бы создать404 для них, хотя я согласен с тем, что он по-прежнему доступен). Например, полный код:
class UrlMappings {
static mappings = {
get "/api/$controller(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/(.$format)?"(action:"index", namespace:'api')
get "/api/$controller/$id(.$format)?"(action:"show", namespace:'api')
post "/api/$controller"(action:"save", namespace:'api')
put "/api/$controller/$id"(action:"updateStatus", namespace:'api')
patch "/api/$controller/$id"(action:"patch", namespace:'api')
delete "/api/$controller/$id"(action:"delete", namespace:'api')
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}
}
"/"(view:"/index")
"500"(view:'/error')
"404"(view:'/notFound')
}
}
Есть ли способ заставить это работать так, как я хочу - например, иметьобратный URL - например, createLink (...) работает? Я думаю, что в какой-то момент в другом приложении я использовал именованные сопоставления, но, похоже, они быстро выходят из-под контроля.
В настоящее время, если я это сделаю
"${createLink(namespace:'api', controller:'upload', action:'post')}"
В результате получается / upload / post, когда мне нужно / api / upload
Final (надеюсь, что редактировать) - это выглядит немного больше, чем просто URL-адреса, появляющиеся вформат я не хочу использовать реверс маппинг.Хотя прямое сопоставление «работает» только с контроллером, при включении безопасности Grails Spring я получаю отказ в доступе к версиям URL / api / upload, но я не уверен на 100%, но, глядя на журналы, они появляютсяпотому что код не может найти контроллер и, следовательно, аннотацию @Secured.