Java

Uma API REST CRUD com Couchbase, RxJava e Ratpack

Em meus dois anterior blog Nas postagens, apresentei o Ratpack e a camada ODM leve disponível em nosso Java SDK. Esta postagem se baseará neles e apresentará uma API REST para gerenciar usuários por meio do repositório do Couchbase.

Quero que minha API seja compatível com os quatro verbos HTTP básicos e com o tipo de conteúdo. Tudo foi pensado para isso no Ratpack. O Cadeia é como um construtor para compor manipuladores. Então, escrevi um novo objeto Ação para vincular uma cadeia ao prefixo de URL 'user'. Isso simplificará bastante meu método principal:

Para garantir que minha instância UserHandler possa ser encontrada, também preciso adicioná-la ao meu módulo Config Guice:

Também adiciono a classe UserRenderer que será usada para lidar com os diferentes tipos de conteúdo.

Renderizador personalizado

No Ratpack, você pode registrar novos RendererSupport classes. Seu objetivo é especificar uma maneira de renderizar seu objeto T com base na classe Contexto. No meu caso, quero renderizar um objeto User com base no tipo de conteúdo do contexto. O objeto Context fornece a você um porConteúdo que permite compor a renderização com base no tipo de conteúdo definido na solicitação. Os tipos usuais já estão predefinidos. No meu caso, quero apenas oferecer suporte a json e texto:

A renderização de texto é apenas um simples toString(). A versão JSON usa o objeto Jackson disponível por padrão no Ratpack. Ele lhe dá acesso a um atalho para conversões JSON/Objeto. Uma chamada para o método json fornecendo o objeto User como argumento é suficiente. O Jackson também é usado internamente pelo nosso Java SDK. Mas há um truque. A anotação @Field que usei no meu ODM do Couchabse não é captada pelo mapeador Jackson padrão usado no Ratpack. Portanto, preciso adicionar a anotação Jackson @JsonProperty para compensar. Eu não teria que adicionar nada se não tivesse usado a anotação @Field em primeiro lugar. Tentarei encontrar uma maneira melhor de fazer isso funcionar, mas, enquanto isso, está funcionando muito bem.

Composição da API com manipuladores

Agora estou em uma boa posição para começar a trabalhar na API. GET, PUT e DELETE precisam de um ID de usuário para funcionar. Portanto, a primeira coisa que estou fazendo é verificar se há algo após o URL /user/. Os manipuladores são todos encadeados e executados na ordem em que você os declara. Quando você entra em um manipulador, a cadeia é interrompida. Portanto, você deve certificar-se de declarar /user/:userId antes de /user/. A vinculação de caminho usa regex, e você encontrará exemplos na seção Cadeia documentação.

Chamando o caminho permite que eu forneça o regex do caminho e um manipulador como argumento. No manipulador, começo obtendo o repositório do Couchbase e o userId dos tokens de caminho. Em seguida, chamo o método porMétodo para definir uma função para cada verbo HTTP que preciso suportar. Aqui, retornarei um usuário para GET, atualizarei ou criarei um usuário para PUT e removerei o usuário para REMOVE.

O verbo mais interessante aqui é o PUT, pois ele requer conteúdo da solicitação. O contexto analisar recebe um Analisar como argumento e retorna uma Promise. Aqui eu quero analisar o JSON da solicitação e mapeá-lo para um objeto User. Portanto, ele retorna uma Promise. Como sou um usuário do RxJava, mapearei essa Promise para um Observable e, em seguida, mapearei o objeto User para um EntityDocument para finalmente salvá-lo no repositório do Couchbase. Em seguida, converto esse observável novamente em uma promessa do ratpack e envio de volta uma string OK simples. Talvez você queira fazer algo mais inteligente em casos reais :)

Quando os verbos HTTP que precisam de um userId forem implementados, poderei concluir todos os outros. E posso fazer isso facilmente com o método todos. Aqui eu obtenho o repositório e o bucket do registro. Em seguida, para o método GET, como ele não tem identificação de usuário, retorno a lista completa de usuários. Para isso, executo uma consulta N1QL básica. Por fim, o método POST é idêntico ao método PUT.

Essa pode não ser uma API totalmente RESTFUL, mas deve lhe dar uma boa ideia de como é fácil criar uma com o Ratpack, o Couchbase e o RxJava. Se você quiser ver mais coisas acontecendo com o Ratpack, como um módulo do Couchbase, entre em contato comigo.

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Laurent Doguin

Laurent é um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve código em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programação reativa e outras coisas que estão na moda. Ele também foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experiência para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Relações com Desenvolvedores na Couchbase.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.