APIs e Microsserviços

24 nov, 2017

Criando API em GoLang

Publicidade

Nesse artigo, veja como criar uma API com GoLang. Para você ter um overview, iremos criar uma API para cadastro de pessoas. Não vou abordar a instalação do Go. Caso você ainda não tenha ele instalado, você pode seguir os passos desse artigo:

Antes de começarmos a desenvolver, precisamos criar um novo diretório dentro do nosso workspace. Para esse artigo, utilizaremos um computador com Windows 10. O caminho do meu workspace ficou:

C:\go\src\github.com\programadrirano\person\.

O nosso primeiro passo será a criação de um novo arquivo chamado main.go, esse será o nosso arquivo root. Em seguida, precisaremos de um editor de textos. Para esse artigo iremos utilizar o Visual Studio Code. Com o arquivo aberto no seu VS Code, atualize ele com o código abaixo:

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"

	"github.com/gorilla/mux"
)

func main() {
	rotas := mux.NewRouter().StrictSlash(true)

	rotas.HandleFunc("/", getAll).Methods("GET")
	rotas.HandleFunc("/persons", create).Methods("POST")
	var port = ":3000"
	fmt.Println("Server running in port:", port)
	log.Fatal(http.ListenAndServe(port, rotas))

}

type Person struct {
	Name string
}

var persons = []Person{

	Person{Name: "Heisenberg"},
	Person{Name: "Pinkman"},
}

func getAll(w http.ResponseWriter, r *http.Request) {

	json.NewEncoder(w).Encode(persons)
}

func create(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json; charset=UTF-8")

	var p Person

	body, err := ioutil.ReadAll(r.Body)

	if err != nil {
		panic(err)
	}

	if err := r.Body.Close(); err != nil {
		panic(err)
	}

	if err := json.Unmarshal(body, &p); err != nil {
		w.Header().Set("Content-Type", "application/json; charset=UTF-8")
		w.WriteHeader(422)
		if err := json.NewEncoder(w).Encode(err); err != nil {
			panic(err)
		}
	}

	json.Unmarshal(body, &p)

	persons = append(persons, p)

	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
	w.WriteHeader(http.StatusCreated)
	if err := json.NewEncoder(w).Encode(p); err != nil {
		panic(err)
	}
}

Vamos entender passo a passo o nosso código:

Linha 3 a 11: Estamos importando os pacotes necessários para nossa aplicação.

Nas linhas 13 a 22, nós temos:

  • 14: Estamos inicializando a nossa rota, passando o valor true para ScrictSlash. Basicamente ele nos permite trabalhar com as nossas rotas da seguinte forma: /rota e dessa /rota/, para mais detalhes sobre ele, segue link da sua documentação.
  • 16: Estamos criando a nossa rota GET, no primeiro parâmetro nós passamos a rota, no segundo, o nome do método que irá responder a nossa chamada e no final, o Verbo HTTP que utilizaremos.
  • 17: A nossa rota para criação, seguindo os passos da linha 16.
  • 18: Variável com a porta que iremos utilizar para nossa API.
  • 19: Estamos printando em nosso console, a porta que estamos utilizando.
  • 20: Estamos passando a porta e as nossas rotas para o listen do pacote HTTP.

Nas linhas 24 a 32, estamos criando um modulo chamado Person e inicializando ele com dois valores.

Nas linhas 34 a 37, criamos o nosso método getAll com dois parâmetros Response e Request e estamos retornando os valores do array que criamos acima.

Por fim, nas linhas 39 a 71, temos:

  • 40 e 41: Estamos configurando o nosso header, setando o seu Content-type.
  • 42: Estamos criando uma variável com o valor da nossa model Person.
  • 44: Estamos recebendo os valores do nosso request e passando para duas variáveis body e err.
  • 46 a 61: Criamos algumas validações, como: se o erro é diferente de nil, se o arquivo veio vazio, e retornamos para o usuário.
  • 63: Estamos fazendo um parse para o nosso Objeto.
  • 65: Como não estamos trabalhando com banco de dados, nós adicionamos o valor no nosso array.
  • 68 a 72: Finalizamos o nosso método retornando o status 201 de criado e o objeto que o nosso usuário enviou.

Agora, para que possamos testar, execute o comando go run .\main.go no seu terminal, ele irá exibir uma mensagem com a porta no seu console. Podemos ver essa execução na imagem abaixo:

(go run)

Nosso próximo passo será testar as nossas rotas. Para isso, abra o endereço no seu navegador: http://localhost:3000/ e caso tudo esteja ok, você receberá o objeto abaixo:

[
  {
   Name: "Heisenberg"
  },
  {
   Name: "Pinkman"
  }
]

Agora, para testarmos o cadastro, iremos utilizar o Postman, ferramenta gratuita que nos auxilia nos testes a requisições HTTP. Com ele aberto, preencha os campos conforme está na imagem abaixo e clique em enviar.

Postman

Por fim, volte no seu método GET e perceba que nós temos um novo registro em nosso retorno.

Caso tenha interesse em baixar a versão final do código desse artigo, segue o seu link no GitHub.