Подтвердить что ты не робот

Внедрить REST API в приложении Grails

Мне было интересно, какой был бы лучший подход, чтобы приложение Grails предлагало API RESTful (в основном, некоторые действия CRUD), которые могут использоваться веб-службой, например. когда вы хотите создать соответствующее приложение iOS для своего браузера или чего-нибудь еще.

Я подумал о создании отдельной части в моем приложении Grails, которое принимает вызовы от www.mywebapp.com/api/someAction, чтобы я мог повторно использовать уровень сервиса. Как я буду делать сопоставление URL тогда? Только один большой ApiController не очень звучит groovy.

Или есть ли лучший подход, о котором я не знал? Этот подход должен поддерживать что-то вроде OAuth для аутентификации пользователя, который вызывает веб-службу.

4b9b3361

Ответ 1

Grails может определенно предоставить REST api, но уровень сложности при этом варьируется в зависимости от того, как зрелый (так же как RESTful) вы хотите, чтобы API был.

Основной REST

Получение базового уровня RESTfullness, где вы манипулируете представлениями ресурсов json или xml с использованием полного диапазона HTTP-глаголов и использования кодов ответа HTTP, довольно просто. Есть 3 основных момента, чтобы получить это на месте:

  • сопоставление URL

    Вот пример того, как я писал сопоставления URL-адресов в недавнем проекте, чтобы разрешить больше URL-адресов RESTful:

    // RESTful list mapping
    name restEntityList: "/$controller"(parseRequest: true) {
        action = [GET: "list", POST: "save"]
    }
    
    // RESTful entity mapping
    name restEntity: "/$controller/$id"(parseRequest: true) {
        action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"]
        constraints {
            id matches: /\d+/
        }
    }
    
  • Консолидация контента

    3 разных способа, которыми Grails может обрабатывать согласование контента, делают структуру очень гибкой, позволяя вам поддерживать гораздо более широкий круг клиентов, которые не могут устанавливать такие вещи, как HTTP-заголовок Accept.

    Вы можете использовать согласование контента для ответа на разные запросы по-разному с помощью блока withFormat на основе того, что указал клиент они хотят. Эта мощная способность также может быть использована для версии вашего API, так же, как Github делает.

  • Статус ответа

    У HTTP уже есть встроенный в него механизм ответа, который позволяет вам использовать врожденные способности в архитектуре, такие как кеширование и компенсационные операции. Хотя некоторые веб-браузеры очень плохо обрабатывают определенные коды ответов, клиентские приложения, использующие ваш API, могут использовать их для значительного упрощения внутреннего кода.

DRY REST

Один из лучших способов сделать ваше приложение RESTful и сохранить его DRY в то же время - максимально использовать рычаги управления, поскольку CRUD по сути одинакова для всех объектов домена. В этой статье о том, чтобы сделать контроллер по умолчанию более RESTful и в этой статье по упрощению контроллера по умолчанию являются прекрасными ресурсами для получения большей мощности от лесов.

Расширенный REST

Как только вы доберетесь до этого момента, у вас есть довольно функциональный REST API для вашего приложения grails. Вы можете выполнять все основные операции CRUD, а ресурсы довольно легко работать.

Однако следующие уровни лестницы к истинному API гипермедиа RESTful намного сложнее достичь. Фиксирование это на дорожной карте для Grails, но в настоящее время это довольно болезненно. Эти части:

  • Ресурсы гиперссылки
  • Типы содержимого
  • Versioning

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

Наконец, есть аспект обеспечения всего этого. В общем случае Spring Безопасность будет держать вас в хорошем положении, обеспечивая безопасность доступа пользователя к вашему api. Поскольку большинство доступа к API доступно из приложения и не является видимым пользователем, базовая или дайджест-аутентификация обычно является самым простым способом. Существует плагин OAuth, который основывается на Spring безопасности. Я лично его не использовал, поэтому я не могу ручаться за стабильность, но мне это выглядит очень хорошо.

В целом, Grails является достаточно гибким и достаточно мощным, чтобы делать REST очень, очень хорошо, но работа еще не выполнена, чтобы сделать REST чисто из коробки.

Ответ 3

В любом случае вы можете его сопоставить, используя любую структуру URL. Grails UrlMapping довольно гибкий, только поведение по умолчанию для отображения на /$controller/$action, но вы можете использовать собственное сопоставление, вы можете отображать каждый URL-адрес вручную и т.д.

См. Документы UrlMapping - http://grails.org/doc/latest/guide/theWebLayer.html#urlmappings

Ответ 4

  • URL-адрес:

    "/api/element/$version/$master" {           controller = "element"           action = [GET: "show" ] }

Это отобразит http-доступ к методу show элемента управления.

  • то есть. метод show:

DRY: api, вероятно, та же логика, что и приложение. Разница заключается в конформации содержания.

...

def show = {
    def elements = elementService.findByMasterVersion(params.master, params.version)
    withFormat {
        xml {
            render(status:200,text:elements as XML, contentType:"text/xml",encoding:"UTF-8")
        }
        json { ... }
        html { ... }
    }
}
  • Oauth довольно чертовски сложно реализовать и кажется излишним для многих ситуаций.