Implementando uma API com gorilla/mux – Aprenda Golang
api/open source/tutoriais
Agora que já temos nossa dependência instalada no sistema, vamos começar nossa API criando um arquivo main.go e importando as dependências que vamos precisar.
Feito isso, vamos escrever uma pequena função para retornar um Hello world!.
No caso dessa função, nós não vamos usar nada da request, mas mesmo assim precisamos coloca-la na assinatura da função.
Agora vamos levantar nossa API criando a principal função do Go.
r.HandleFunc("/", HandleHello)
Para subir nossa API é só executar um go run main.go.
Com a API em pé, vamos testar ela com o comando curl http://localhost:8080. Se tudo certo, você deverá ter recebido um Hello world! como resposta.
Uma coisa interessante na nossa API é que, se executarmos o mesmo teste só que enviando um POST ao invés de GET (padrão do curl), nós vamos ter a mesma resposta.
Agora, vamos supor que não faça sentido essa rota receber um POST. Para que ela só atenda requisições do tipo GET, tudo o que precisamos fazer é adicionar um .Methods("GET") que o gorilla/mux irá tratar isso para nós.
r.HandleFunc("/", HandleHello).Methods("GET")
Ao subir novamente a API e executar um curl -X POST http://localhost:8080 você verá que não teremos mais o Hello world! como resposta.
O .Methods() aceita uma lista de métodos, ou seja, caso seu endpoint vá tratar mais de um tipo de método, porém não todos os tipos, é possível utiliza-lo para fazer esse filtro. Exemplo:
r.HandleFunc("/products", HandleProducts).Methods("GET", "POST")
Para incrementar um pouquinho mais nossa API, vamos adicionar um parâmetro nesse nosso endpoint para que ele possa retornar algo como Hello Tiago! ao invés de só Hello world!.
r.HandleFunc("/{name}", HandleHello).Methods("GET")
Ao adicionar o {name}, se executarmos um curl http://localhost:8080, vamos receber um 404 como resposta pois nenhuma rota faz match com esse path.
Para finalizar nossa mudança, vamos extrair a variável passada no path e exibir ela na resposta.
fmt.Fprintf(w, "Hello %s!\n", vars["name"])
Suba a API novamente e teste com algo similar à curl http://localhost:8080/Tiago.
Show de bola, mas e se eu quiser retornar um JSON ao invés de texto puro?
Bom nesse caso precisamos adicionar o package encoding/json à nossa lista de imports e fazer mais uma pequena mudança.
Levantando a API novamente e executando o mesmo teste, você verá que a resposta agora é um JSON. Se quiser pode adicionar um -vv ao final do comando curl para que tenha mais informações sobre a request/response.
Vale lembrar aqui também que o método Encode aceita uma interface{} como parâmetro, ou seja, ao invés de criar esse map[string]string, você pode passar uma struct e o método fará todo o trabalho de conversão.
Para finalizar nosso tutorial, vamos adicionar uma nova função para tratar um POST com o payload em JSON.
Para facilitar, vamos adicionar também uma struct.
Agora vamos adicionar uma nova rota na nossa função principal.
r.HandleFunc("/person", HandlePerson).Methods("POST")
Levante a API e teste com o comando:
$ curl -X POST http://localhost:8080/person -H "application/json" -d '{"name": "Tiago Temporin", "age": 31}'
Você deve receber uma resposta similar à Nome: Tiago Temporin - Idade: 31.
api, decode, encode, get, go, golang, gorilla/mux, json, net/http, open source, post, server, tutorial
Um comentário sobre "Implementando uma API com gorilla/mux"
Testando API's feitas com gorilla/mux – Aprenda Golang disse:
16 dezembro 2021 às 11:44 am
[…] semanas atrás implementamos uma API utilizando gorilla/mux (link do post). No entanto, deixamos de lado algo que é muito importante, os famosos testes. Por isso, nesse […]