Реализация API REST в приложении Grails - PullRequest
27 голосов
/ 30 марта 2012

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

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

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

Ответы [ 4 ]

58 голосов
/ 02 мая 2012

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

Основной отдых

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

  1. Отображение URL

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

    // 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+/
        }
    }
    
  2. Согласование содержания

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

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

  3. Статус ответа

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

СУХОЕ ОТДЫХ

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

Расширенный отдых

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

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

  1. Гипермедиа ресурсы
  2. Типы содержимого
  3. Versioning

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

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

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

6 голосов
/ 30 марта 2012

Документация по Grails хороша при настройке RESTfull api

http://grails.org/doc/latest/guide/webServices.html#13.1

1 голос
/ 02 мая 2012
  • отображение URL:

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

Это отобразит http get на метод 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 довольно сложен в реализации и во многих ситуациях кажется излишним.
1 голос
/ 30 марта 2012

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

...