example web-services api rest grails grails-2.0

web-services - example - grails rest api



Implementar una API REST en una aplicaciĆ³n Grails (4)

Me preguntaba cuál sería el mejor enfoque para hacer que una aplicación Grails ofrezca una API RESTful (algunas acciones CRUD principalmente) que pueda usar un servicio web, por ejemplo, cuando desee construir una aplicación iOS correspondiente en su aplicación basada en navegador o Algo más.

Pensé en construir una parte separada en mi aplicación Grails que recibe llamadas de www.mywebapp.com/api/someAction para poder reutilizar la capa de servicio. ¿Cómo haría el mapeo de URL entonces? Solo tener un ApiController grande no suena muy bien.

¿O hay algún enfoque mejor que yo no sepa? Este enfoque debe ser compatible con algo como OAuth para autenticar al usuario que está llamando al servicio web.


Grails definitivamente puede proporcionar una API REST, pero el nivel de dificultad al hacerlo varía según la mature (también conocida como RESTful) que desee que tenga la API.

Descanso Básico

Obtener un nivel básico de RESTfullness, donde se manipulan las representaciones json o xml de recursos usando el rango completo de verbos HTTP y aprovechando los códigos de respuesta HTTP, es bastante fácil. Hay 3 piezas principales para conseguir eso en su lugar:

  1. Mapeo URL

    Aquí hay un ejemplo de cómo escribí mis asignaciones de URL en un proyecto reciente para permitir más 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+/ } }

  2. Negociación de contenido

    Las 3 formas diferentes en que Grails puede manejar la negociación de contenido hacen que el marco sea muy flexible, lo que le permite admitir una gama mucho más amplia de clientes que quizás no puedan configurar cosas como el encabezado Aceptar de HTTP.

    Puede usar la negociación de contenido para responder a diferentes solicitudes de diferentes maneras utilizando el bloque withFormat función de lo que el cliente haya indicado que desea. Esta poderosa habilidad también se puede usar para versionar su API, al igual que hace Github .

  3. Estado de respuesta

    HTTP ya tiene un gran mecanismo de respuesta integrado que le permite aprovechar las habilidades innatas en la arquitectura, como la capacidad de almacenamiento en caché y las operaciones de indemnización. Si bien algunos navegadores web no manejan con mucha gracia ciertos códigos de respuesta, las aplicaciones cliente que usan su API pueden usarlos para simplificar en gran medida su código interno.

DESCANSO SECO

Una de las mejores maneras de hacer que su aplicación sea RESTful y mantenerla SECA al mismo tiempo es aprovechar el andamio del controlador tanto como sea posible, ya que CRUD es esencialmente el mismo para todos los objetos de dominio. Este artículo sobre cómo hacer que el controlador predeterminado sea más RESTful, y este artículo sobre cómo simplificar el controlador predeterminado son recursos excelentes para obtener más potencia del andamio.

RESTO avanzado

Una vez que llegas a ese punto, tienes una API REST bastante funcional para tu aplicación Grails. Puede hacer todas las operaciones básicas de CRUD y los recursos son bastante fáciles de usar.

Sin embargo, los siguientes niveles de la escalera hacia una verdadera API de hipermedia RESTful son mucho más difíciles de alcanzar. Reparar esto está en la hoja de ruta de Grails, pero actualmente es bastante doloroso. Estas piezas son:

  1. Recursos de hipermedia
  2. Tipos de contenido
  3. Versiones

Afortunadamente, hay un complemento que hace que la definición de marshallers personalizados sea muy fácil, lo que nos permite cubrir con bastante facilidad las tres piezas restantes del rompecabezas de REST.

Finalmente, está el aspecto de asegurar todo. En general, Spring Security lo mantendrá en una buena posición para asegurar el acceso de los usuarios a su API. Como la mayoría del acceso a la API proviene de una aplicación y no es visible para el usuario, la autenticación básica o resumida suele ser la forma más sencilla de hacerlo. Hay un complemento de OAuth que se basa en Spring Security. No lo he usado personalmente, así que no puedo garantizar su estabilidad, pero se ve bastante bien para mí.

En general, Grails es flexible y lo suficientemente potente como para hacer REST muy, muy bien, pero el trabajo aún no se ha hecho para que funcione perfectamente REST desde el primer momento.


Puede asignarlo de todos modos, usar cualquier estructura de url. Grails UrlMapping es bastante flexible, solo es un comportamiento predeterminado asignar a /$controller/$action , pero puedes usar tu propia asignación, puedes eventualmente mapear cada url manualmente, etc.

Consulte los documentos de UrlMapping - http://grails.org/doc/latest/guide/theWebLayer.html#urlmappings



  • mapeo de url:

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

Esto asignará el http al método show del elemento controlador.

  • es decir, el método de mostrar:

DRY: La API es probablemente la misma lógica que la aplicación. La diferencia es la negociación de contenido.

... 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 es bastante complicado de implementar y parece excesivo para una gran cantidad de situaciones.