Grails 3 API пространства имен URLMappings - PullRequest
0 голосов
/ 03 июля 2019

Мне интересно об этом, и это то, с чем я сталкивался раньше и просто работал с кучей построчных сопоставлений.

Скажем, я хочу приложение 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.

1 Ответ

0 голосов
/ 03 июля 2019

Хорошо, поэтому ответ заключается в том, чтобы получить плагин отчета о сопоставлениях URL-адресов или, в качестве альтернативы, кто-то еще, чтобы проверить ваш код.

По сути, это была опечатка с моей стороны, последняя конфигурация, которую я имел, работала достаточно хорошо после исправления.

Сначала - с плагином безопасности вы получаете 403 экземпляра из 404.

Во-вторых, обратное отображение через createLink возвращает фиктивный URL-адрес вместо сообщения об ошибке (например, если нет соответствующего контроллера, скажем, из-за указанной опечатки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...