Применение RESTful grails: СУШКА UrlMapping - PullRequest
7 голосов
/ 05 июня 2009

Допустим, у нас есть веб-приложение grails, предоставляющее несколько ресурсов.

  • метка
  • URLs
  • Пользователи

Приложение имеет классический веб-интерфейс, с которым взаимодействуют пользователи и администрация. Мы хотим представить ресурсы из приложения клиентам через RESTful API, и мы не хотим, чтобы эта часть приложения загромождала контроллеры и код, который у нас уже есть. Итак, мы придумали следующее:

Если веб-интерфейс предлагает host/app_path/url/[list|show|create], мы хотим, чтобы REST API был на /host/app_path/rest/url.

Итак, мы получили следующий файл UrlMappings:

class UrlMappings {
static mappings = {
    "/$controller/$action?/$id?"{

    }

    /* adding new urls and listing them */
    "/rest/url"{
        controller = "urlRest"
        action = [POST: "save", PUT: "save", GET: "list", DELETE:"error"]
    }

    /* accessing a single url */
    "/rest/url/$id"{
        controller = "urlRest"
        action = [POST: "update", PUT: "update", GET: "show", DELETE: "delete"]
    }

    /* non-crud stuff on urls */
    "/rest/url/$action?/$id?"{
        controller = "urlRest"
    }

    "/"(view:"/index")
    "500"(view:'/error')
}
}

Проблема в том, что это не самая сухая вещь здесь. Это ухудшается, когда мы добавляем больше ресурсов, таких как теги. Они переведут еще на три блока очень похожего кода ...

Не грубые функции - это такие вещи, как поиск по определенным критериям и тому подобное ...

Мы попытались сгенерировать замыкания отображения с помощью цикла, но безуспешно. Мы полностью на неправильном пути?

1 Ответ

7 голосов
/ 27 июня 2009

Я бы порекомендовал следующее отображение:

"/rest/url/$id?"(resource:"urlRest")

Ниже приведен HTTP-метод сопоставления действий, который будет создан для urlRestController:

GET         show
PUT         update
POST        save
DELETE      delete

Я понимаю, почему вы можете захотеть отобразить / rest / url POST для сохранения и / rest / url / id PUT для обновления, но это противоречит значению этих глаголов. PUT должен быть единственным способом добавить новый URL, а POST - единственным способом обновить URL. Делать это так, как вы изложили, будет работать и, возможно, будет лучшим способом, если ваше ограничение заключается в том, чтобы сохранить текущий код контроллера без изменений. Тем не менее, я предполагаю, что ваш контроллер может быть уже закодирован для обработки отображений по умолчанию (обновление / удаление дает ошибку, если нет идентификатора, показывает перенаправления в список, если нет идентификатора и т.

...