Na aula anterior, configuramos nossa primeira rota automática. Agora, vamos aprofundar um conceito fundamental no desenvolvimento de APIs: os Endpoints e como o Go gerencia as diferentes intenções do cliente através dos métodos HTTP.
Como vimos brevemente na introdução, uma rota é o caminho de texto (ex: /alunos). Já o endpoint é a combinação exata desse caminho com um Método HTTP (a ação que o cliente quer realizar).
Isso significa que a mesma rota /alunos pode se comportar de formas totalmente diferentes dependendo de como ela é chamada. Uma chamada para listar alunos é um endpoint diferente de uma chamada para cadastrar um novo aluno, mesmo que a URL seja idêntica.
Para interagir com os recursos de uma API, utilizamos verbos padronizados pelo protocolo HTTP. Abaixo estão os principais métodos utilizados no mercado:
| Método HTTP | Descrição / Ação | Exemplo Prático |
|---|---|---|
| GET | Utilizado para buscar e ler informações do servidor. Não altera dados. | Buscar a lista de alunos cadastrados. |
| POST | Utilizado para enviar dados e criar um novo recurso no servidor. | Cadastrar um novo aluno na API. |
| PUT | Utilizado para atualizar todas as informações de um recurso existente. | Substituir todos os dados de um aluno (Nome, Idade, Nota). |
| PATCH | Utilizado para atualizar parcialmente um recurso existente. | Alterar apenas o telefone de um aluno, mantendo o restante. |
| DELETE | Utilizado para remover um recurso específico do servidor. | Excluir o registro de um aluno do sistema. |
Antigamente, para criar endpoints específicos para cada método em Go, precisávamos de bibliotecas externas ou de condicionais (if/else) complexas dentro de uma mesma função.
Nas versões modernas do Go, o pacote nativo net/http foi atualizado e agora nos permite definir o método diretamente na rota de forma extremamente limpa e simples. Veja como fica o nosso código atualizado:
// Pacote principal da aplicação
package main
// Importações dos pacotes nativos
import (
"fmt"
"net/http"
)
// Função para retornar um Hello World!
func helloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello World!")
}
// Função principal
func main() {
// Configuração de Endpoints: Agora definimos o método "GET" antes da rota "/"
http.HandleFunc("GET /", helloWorld)
// Retornar o funcionamento do servidor
fmt.Println("Servidor em execução no endereço: http://localhost:8080")
// Configurar servidor
http.ListenAndServe(":8080", nil)
}
Observe que agora escrevemos "GET /" dentro de http.HandleFunc. Com isso, se alguém tentar enviar uma requisição do tipo POST para a raiz da nossa API, o Go rejeitará automaticamente o pedido, garantindo que a nossa função seja executada estritamente quando houver uma requisição de leitura (GET).
Você pode acompanhar cada etapa descrita acima no vídeo a seguir: