Consumindo API do GitHub com Go

Eae, bom?

Hoje eu vou falar um pouco sobre a utilização de APIs com Go.

Go é uma excelente linguagem para desenvolver APIs, mas como ela se sai no papel de consumir uma?

Isso é o que veremos agora. Mostrarei qual a melhor abordagem (na minha opinião) a se tomar, qual a arquitetura utilizar e mais.

Mas antes, dê uma olhada no resultado final, para você ficar ansioso(a), ou não.

Resultado final.

Vamos lá.

Para mostrar na prática vamos usar a API do GitHub, sugiro que você dê uma olhada na documentação, que pode ser encontrada aqui.

Comece criando uma pasta no seu GOPATH para colocar nossos arquivos e dentro da pasta, crie uma outra chamada client, que será onde colocaremos nossos arquivos relacionados ao cliente da API.

A primeira coisa a se fazer é definir algumas constantes, sendo elas a URL base das nossas chamadas e o tipo de dado que será trafegado, o mediaType.

Depois, podemos definir uma estrutura para gerenciar a comunicação com a API.

client/client.go

Também vamos criar estruturas para nossas respostas e possíveis respostas de erros.

Precisamos fazer com que a estrutura ErrorResponse implemente a interface de Error, basta implementar o método Error() string.

Agora vamos criar uma função que retorna uma nova Response dado uma http.Response, é bem simples.

E então criamos umas função para verificar por erros em uma Response.

Pronto, depois de todas estas funções, podemos de fato começar a implementar o cliente.

Lembra lá em cima na definição da estrutura Client, onde eu comentei que iremos definir nossos Services? Então chegou a hora.

Em nosso contexto, um service é uma estrutura que fica encarregada da comunicação com a API e gerencia apenas uma coisa. Neste exemplo, criaremos somente o service para gerenciar os repositórios, mas em algo mais prático haveria um para gerenciar os usuários, outro para os gists e assim vai indo.

Crie o arquivo repository.go dentro da pasta client.

Vamos lá. Começando de novo criando constantes.

clients/repository.go

E então vamos ao nosso model. Adicionei somente alguns campos, mas se você der uma olhada na documentação você verá que a chamada retorna muito mais, então é só ir adicionando o que você precisar, só não esqueça da ‘json tag’, ela dever ser a mesma que é retornada.

clients/repository.go

And now?

Interfaces, here we go.

Agora vamos criar uma linda interface onde definiremos nossos métodos e uma estrutura para posteriormente implementar esta interface.

Note que definimos três métodos na interface acima, note também que dois deles possuem um parâmetro desconhecido para nós, deixe-me explicar o que eles são.

Se você der uma olhada na documentação da API você perceberá que ao listar e/ou pesquisar você pode passar alguns parâmetros diferentes, e exatamente isto que o ListOptions e SearchOptions fazem, então vamos implementa-los que será mais fácil de entender.

Aquela tag url nos sugere que estas propriedades da estrutura serão decodificadas como parâmetros de URL, porém precisamos automatizar esta conversão, de Struct para parâmetros de URL.

Voltando ao nosso arquivo client.go vamos adicionar uma funcão helper que irá fazer esta conversão para nós.

client/client.go

Agora vamos fazer nosso service implementar a interface, para isso precisamos implementar todos os métodos que a interface define.

client/repository.go

Agora vamos ao último passo. Voltando no client.go, atualizaremos nossa estrutura Client e função NewClient com o seguinte código.

Muito bem, tudo pronto, agora vamos testar :D

Fora da pasta client vamos criar nosso main.go.

main.go

Pronto, só compilar, executar e ficar admirando o resultado.

Você pode estar pensando que foi muito código para pouca coisa. Bom se for levar em consideração somente este pequeno exemplo, eu até que concordo, porém, acima nós definimos uma arquitetura que nós permite escalar facilmente nossa aplicação, adicionando vários services, cada um encarregado de gerenciar somente a sua parte.


Bom, é isso aí. Este é o primeiro post em que falo sobre Go, é uma linguagem que ainda estou aprendendo e tem muita coisa para se aprender, irei fazendo mais postagens conforme meu aprendizado avança, assim poderemos todos aprendermos juntos.

Por favor, dê seu feedback sobre o post será de extrema ajuda para que eu possa melhorar cada vez mais.

Até a próxima, vlw.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.