Java

Una API CRUD REST con Couchbase, RxJava y Ratpack

En mis dos anterior blog posts he presentado Ratpack y la capa ODM ligera disponible en nuestro SDK de Java. Este post se basará en ellos y mostrará una API REST para gestionar usuarios a través del repositorio Couchbase.

Quiero que mi API soporte los cuatro verbos HTTP básicos y soporte content-type. Todo ha sido pensado para eso en Ratpack. La dirección Cadena es como un constructor para componer manejadores. Así que escribí un nuevo Acción para enlazar una cadena al prefijo 'user' URL. Esto simplificará mucho mi método principal:

Para asegurarme de que mi instancia de UserHandler puede ser encontrada, también necesito añadirla a mi módulo Config Guice:

También añado la clase UserRenderer que se utilizará para manejar los diferentes tipos de contenido.

Renderizador personalizado

En Ratpack puede registrar nuevos RendererSupport . Su objetivo es especificar una forma de renderizar su objeto T basándose en la clase Contexto. En mi caso quiero renderizar un objeto Usuario basado en el tipo de contenido del contexto. El objeto Context te da un porContenido que permite componer el renderizado basándose en el tipo de contenido establecido en la solicitud. Los tipos habituales ya están predefinidos. En mi caso solo quiero soportar json y texto:

La representación del texto es un simple toString(). La versión JSON utiliza el objeto Jackson disponible por defecto en Ratpack. Te da acceso a un atajo para conversiones JSON/Objeto. Una llamada al método json con el objeto User como argumento es suficiente. Jackson también es utilizado internamente por nuestro Java SDK. Pero hay un truco. La anotación @Field que utilicé para mi ODM Couchabse no es recogida por el mapeador Jackson por defecto utilizado en Ratpack. Así que tengo que añadir la anotación @JsonProperty de Jackson para compensar. No habría tenido que añadir nada si no hubiera utilizado la anotación @Field en primer lugar. Voy a tratar de encontrar una mejor manera de hacer que esto funcione, pero mientras tanto funciona muy bien.

Componer la API con manejadores

Ahora estoy en una buena posición para empezar a trabajar en la API. GET, PUT y DELETE necesitan un identificador de usuario para funcionar. Así que lo primero que estoy haciendo es comprobar si hay algo después de la URL /user/. Los handlers están todos encadenados y se ejecutan en el orden en que los declaras. Una vez que entras en un manejador, la cadena se detiene. Así que asegúrate de declarar /user/:userId antes de /user/. La vinculación de rutas usa regex, encontrarás ejemplos en la sección Cadena documentación.

Llamada al ruta me permite dar el path regex y un handler como argumento. En el Handler empiezo obteniendo el repositorio Couchbase y el userId de los tokens de la ruta. Luego llamo al método byMethod para definir una función para cada verbo HTTP que necesito soportar. Aquí devolveré un usuario para GET, actualizaré o crearé un usuario para PUT y eliminaré el usuario para REMOVE.

El verbo más interesante aquí es PUT, ya que requiere contenido de la solicitud. El contexto analizar toma un método Analice como argumento y devuelve una Promise. Aquí quiero parsear el JSON de la petición y mapearlo a un objeto User. Así que devuelve una Promise. Como soy usuario de RxJava mapeo esa Promise a un Observable, luego mapeo el objeto User a un EntityDocument para finalmente guardarlo en el repositorio de Couchbase. Luego convierto ese observable de nuevo en una promesa ratpack y envío de vuelta una simple cadena OK. Puede que quieras hacer algo más inteligente en casos reales :)

Una vez implementados los verbos HTTP que necesitan un userId, puedo terminar con todos los demás. Y puedo hacerlo fácilmente con el método todos. Aquí obtengo el repositorio y el bucket del registro. Luego para el método GET, como no tiene id de usuario, devuelvo la lista completa de Usuarios. Para ello ejecuto una consulta básica N1QL. Finalmente el POST es idéntico al método PUT.

Puede que no sea una API totalmente RESTFUL, pero debería darte una buena idea de lo fácil que es crear una con Ratpack, Couchbase y RxJava. Por favor, házmelo saber si quieres ver más cosas sucediendo alrededor de Ratpack, como un Módulo Couchbase.

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Laurent Doguin

Laurent es un metalero empollón que vive en París. Principalmente escribe código en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programación reactiva y otras cosas de moda. También fue Developer Advocate de Clever Cloud y Nuxeo, donde dedicó su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.