6 - O Conceito de Endpoints e Métodos HTTP

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.

O que é um Endpoint?

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.

Os Principais Métodos HTTP

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.

A Nova Estrutura de Endpoints no Go

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: