Há algumas semanas, mencionei que estava aprendendo sobre o GraphQL, cada vez mais popular, e como ele pode substituir a API RESTful comum. Em minha exemplo anteriorNa seção "Como criar um aplicativo GraphQL", vimos como criar um aplicativo GraphQL usando o Node.js e um Couchbase Banco de dados NoSQL. No entanto, sou tão fã da linguagem de programação Go quanto do Node.js.

Veremos como criar um aplicativo com a Golang que pode criar e consultar dados usando Consultas GraphQL em vez de vários endpoints de API RESTful.

Se você não estiver familiarizado com o GraphQL, ele funciona passando consultas de um front-end para o back-end e recebendo de volta apenas os dados que você solicitou, independentemente de sua origem ou complexidade, em vez de consumir dados de vários endpoints de API potencialmente não relacionados. Isso reduz suas solicitações e sua carga de dados, mantendo as coisas rápidas e eficientes.

Introdução ao GraphQL e à Golang

Como em uma API RESTful, a maior parte de um aplicativo GraphQL consistirá na configuração. No entanto, menos de um aplicativo GraphQL dependerá de planejamento, o que é diferente de uma API RESTful, que exige um planejamento pesado para permanecer fácil de usar.

Precisamos instalar uma dependência do pacote GraphQL para o Golang antes de prosseguirmos. Na linha de comando, execute o seguinte:

Com nossa dependência disponível, crie um novo projeto em seu $GOPATH. Dentro desse projeto, crie um arquivo chamado main.go e incluir o seguinte, que será nossa base de aplicativos:

Nosso plano é criar um aplicativo que possa criar e consultar contas, bem como criar e consultar entradas de blog para qualquer conta específica. O modelo de dados do nosso aplicativo é definido pelo Conta e a estrutura Blog estrutura. Esse modelo de dados ajudará a alimentar nosso modelo de dados de banco de dados, bem como nosso modelo de dados GraphQL.

Quando se trata da configuração do GraphQL, você perceberá que há alguns objetos criados. O objeto accountType e o blogType representam o modelo de dados GraphQL que será criado em torno das estruturas Go. Eles ainda não estão configurados, mas serão. O rootQuery será o conjunto de consultas que podemos executar e o rootMutation será qualquer mutação de alteração de dados que possa ser executada. Com o GraphQL, você não está limitado apenas à leitura de dados.

O esquema GraphQL nos permite definir o que são consultas e o que são mutações. Isso é necessário para quando desejamos consumir consultas. Mesmo que não estejamos criando uma API RESTful, ainda precisamos de um endpoint HTTP. Esse único /graphql tratará de todas as consultas e mutações e é alimentado pelo esquema.

Antes de conectar o banco de dados, podemos definir nosso esquema GraphQL:

Observe que estamos definindo apenas os nomes das propriedades e o tipo de dados correspondente. Eu lhe disse que seria muito semelhante à forma como definimos as estruturas de dados em Go.

Agora vamos nos concentrar em carregar nosso esquema com dados do Couchbase Server.

Consulta de dados de um banco de dados NoSQL com GraphQL

Até o momento, não fizemos nenhuma preparação do banco de dados. O objetivo deste tutorial não é configurar o Couchbase. Você precisará do Couchbase Server disponível com suporte a N1QL, um Bucket, alguns índices e uma conta de controle de acesso baseada em função para o aplicativo.

Na linha de comando, execute as seguintes linhas para obter nossos pacotes de banco de dados:

Os comandos acima nos darão um pacote para criar valores UUID para chaves de documentos, bem como o Couchbase Go SDK.

Ignorando tudo o que já fizemos com nosso main.go dê uma olhada no código a seguir e encaixe-o no que você tem, onde fizer sentido:

Observe que definimos um Bucket que usaremos ao interagir com o banco de dados. Estamos nos conectando a um cluster do Couchbase no principal autenticação com uma conta RBAC e abertura de um Bucket, todos os quais devem ter sido definidos antes de iniciar este tutorial.

Vamos supor que você já tenha dados em seu banco de dados. Vamos começar tentando consultar os dados. Lembra-se do seguinte trecho de código que foi adicionado anteriormente?

Cada campo existirá como um campo no Campos propriedade. Digamos que queremos obter todas as contas do nosso banco de dados.

No código acima, estamos criando um campo GraphQL chamado contas que retornará uma lista de accountType quando executado. O Resolver é a função que faz o trabalho pesado. Opcionalmente, podemos passar parâmetros de consulta, mas para esse campo específico não estamos passando. Ao tentar consultar as contas, estamos criando uma consulta N1QL que retorna todas as propriedades e resultados possíveis. A consulta GraphQL determinará quais dessas propriedades e resultados serão enviados ao cliente.

Veja a seguinte consulta de front-end que pode ser executada:

Embora pudéssemos obter o id, primeiro nomee sobrenomeestamos optando por obter apenas o id e primeiro nome de nossos resultados. Para realmente executar a consulta, emitiríamos uma instrução cURL como esta:

Lembre-se de que nossa consulta GraphQL é enviada para visualizar os parâmetros de consulta em nosso endpoint de API.

Vamos dar uma olhada em outra possível consulta GraphQL. Digamos que queiramos consultar uma conta específica, não todas as contas. Poderíamos criar um campo como o seguinte:

Esse campo, quando consultado, retornará um único accountTypemas há argumentos que podem ser passados. Estamos exigindo que um id esteja presente e estamos exigindo que seja uma string. Na seção Resolver, podemos obter o id e usá-lo para obter um documento NoSQL pela chave do documento. O resultado é retornado e a consulta GraphQL determina quais propriedades são enviadas de volta ao cliente.

Veja a seguinte consulta:

Na consulta acima, passamos um ID e optamos por retornar apenas o primeiro nome e sobrenome dos resultados. Para executar de fato essa consulta, podemos emitir uma instrução cURL como a seguinte:

Agora, digamos que queremos retornar todos os blogs de uma determinada conta de usuário. As etapas serão semelhantes às que vimos quando consultamos uma conta específica. O seguinte existiria como um campo em nosso rootQuery:

O resultado será uma lista de blogType e estamos esperando um conta a ser passado no formato de cadeia de caracteres. Dentro do Resolver podemos obter a função conta e usá-lo em uma consulta N1QL parametrizada. A consulta retornará todas as entradas de blog somente para uma determinada conta com base no valor conta valor.

A consulta para obter todos os blogs pode ser parecida com a seguinte:

O exemplo acima é bastante semelhante ao que vimos ao consultar uma conta específica. Estamos esperando uma variável e optamos por retornar apenas a variável id e o título propriedades.

Quer ver uma consulta bem legal com base no que temos até agora? Dê uma olhada na consulta a seguir:

No exemplo acima, estamos fazendo uma única solicitação. É uma única consulta, mas estamos solicitando dados de conta e dados de blog de uma determinada conta. Se tivéssemos feito isso com uma API RESTful, teríamos feito várias solicitações ao nosso servidor e teríamos feito possíveis mutações no nível do aplicativo.

O comando cURL teria a seguinte aparência:

Até agora, fizemos apenas consultas de leitura. E se quisermos fazer uma mutação em que criamos ou alteramos dados?

Vamos dar uma olhada nas mutações de dados com o GraphQL.

Em vez de trabalhar no rootQueryVamos trabalhar no rootMutation. Para os campos, adicione o seguinte:

Observe que estamos retornando um accountType e que estamos esperando que dois parâmetros sejam passados com a nossa consulta. No entanto, a estratégia realmente não é diferente.

No Resolver estamos obtendo nossos parâmetros e usando-os para criar uma nova conta no banco de dados. Como isso está vinculado ao nosso esquema como uma mutação, estamos consultando de forma diferente.

Primeiro, aqui está a consulta que queremos executar:

Observe que estamos prefixando com a palavra mutação. No cURL, ele teria a seguinte aparência:

Agora eu poderia continuar criando campos que fazem consultas ou mutações, mas as etapas são as mesmas. Deixo para sua imaginação continuar contribuindo para essa ideia específica de aplicativo.

Conclusão

Você acabou de ver como usar GraphQL para consultar dados em um aplicativo Golang que usa um Banco de dados NoSQL. O GraphQL é muito útil se você quiser permitir que o usuário defina os dados que deseja em uma única solicitação, em vez de criar incansavelmente vários pontos de extremidade de API RESTful que o usuário deve acompanhar. É importante observar que o GraphQL não é um substituto quando se trata de seu aplicativo consultar o banco de dados. Você ainda precisará criar consultas N1QL adequadas em Couchbase. O GraphQL opera somente no nível do cliente.

Para obter mais informações sobre o uso de Go com o Couchbase, consulte a seção Portal do desenvolvedor do Couchbase.

Autor

Postado por Nic Raboy, defensor dos desenvolvedores, Couchbase

Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.

Deixar uma resposta