Echo: Ecossistema de Middleware & Wrapper de Contexto
Echo é um framework HTTP completo centrado em echo.Context, um pipeline de middleware com Next(), e suporte de primeira classe para binding, validação e WebSockets.
Busque em todas as páginas da documentação
Echo é um framework HTTP completo centrado em echo.Context, um pipeline de middleware com Next(), e suporte de primeira classe para binding, validação e WebSockets.
Ele visa equipes que constroem APIs JSON e endpoints em tempo real que desejam a ergonomia do framework com uma superfície menor do que algumas alternativas.
Handlers do Echo têm a assinatura func(c echo.Context) error.
Retornar um erro delega para HTTPErrorHandler, permitindo envelopes de erro JSON consistentes.
Middleware compõe como echo.MiddlewareFunc, e o framework envia middleware de logging, recuperação, CORS e ID de requisição em seu ecossistema.
Cartão de receita de referência rápida - pronto para copiar e colar.
e := echo.New()
e.Use(middleware.Recover())
e.Use(middleware.RequestID())
e.POST("/users", func(c echo.Context) error {
var u user
if err := c.Bind(&u); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
return c.JSON(http.StatusCreated, u)
})Quando usar isso:
error retornadosNext() explícito de middleware em vez de apenas wrappers de handlerspackage main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
type createUser struct {
Email string `json:"email" validate:"required,email"`
Name string `json:"name" validate:"required,min=2"`
}
type user struct {
ID int `json:"id"`
Email string `json:"email"`
Name string `json:"name"`
}
func main() {
e := echo.New()
e.HideBanner = true
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Validator = &customValidator{}
api := e.Group("/api/v1")
api.GET("/health", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{"status": "ok"})
})
api.POST("/users", func(c echo.Context) error {
var in createUser
if err := c.Bind(&in); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
if err := c.Validate(&in); err != nil {
return err
}
return c.JSON(http.StatusCreated, user{ID: 1, Email: in.Email, Name: in.Name})
})
e.Start(":8080")
}
type customValidator struct{}
func (cv *customValidator) Validate(i any) error {
// Conecte o validador github.com/go-playground/validator em produção
return nil
}O que isso demonstra:
Bind para corpos JSON e hook Validate separadoerror com echo.NewHTTPErrorecho.New() cria um motor com slots para roteador, binder e validador.c.Next() continua a cadeia até que o handler da rota seja executado.echo.Context incorpora acessadores para http.ResponseWriter e *http.Request (Request(), Response()).Start e StartTLS iniciam http.Server com Echo como handler.| Família de métodos | Propósito |
|---|---|
Param, QueryParam, FormValue | Ler entradas |
Bind | Decodificar corpo/query/path em structs |
JSON, String, Blob, File | Escrever respostas |
Redirect, NoContent | Controlar status e cabeçalhos |
Echo, Path, RealIP | Metadados do framework |
Echo fornece helpers de upgrade de echo.Context (via padrões golang.org/x/net/websocket e middleware).
Use para notificações, chat ou streaming quando o long-polling HTTP for insuficiente.
Mantenha o ciclo de vida da conexão e a autenticação no momento do upgrade explícitos.
// HTTPErrorHandler personalizado para erros no estilo problem+json
e.HTTPErrorHandler = func(err error, c echo.Context) {
he, ok := err.(*echo.HTTPError)
if !ok {
he = &echo.HTTPError{Code: http.StatusInternalServerError, Message: http.StatusText(500)}
}
if !c.Response().Committed {
c.JSON(he.Code, map[string]any{"message": he.Message})
}
}Centralizar erros evita vazar traces de pilha em respostas de produção.
c.Validate é um no-op até que e.Validator seja definido. Correção: registre o adaptador go-playground/validator em main.HTTPErrorHandler. Correção: retorne erros antes de escrever corpos ou verifique c.Response().Committed.Bind mescla fontes - Bind pode popular de path, query e corpo; sobrescritas inesperadas se as tags se sobrepuserem. Correção: use opções de Bind ou métodos de bind separados por fonte.e.Group com middleware por grupo para limites de autenticação.err.Error() bruto para clientes vaza detalhes internos. Correção: mapeie para códigos externos estáveis em HTTPErrorHandler.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Gin | Ecossistema de plugins maior e velocidade JSON similar | Você quer o estilo de tratamento de erro de retorno de erro do Echo |
| chi | Portabilidade do http.Handler da stdlib | Você quer helpers de bind/validate/WebSocket integrados |
| net/http + gorilla/websocket | Dependências mínimas | Você prefere middleware Echo integrado |
| Fiber | HTTP rápido não-stdlib | Você precisa de interoperação estrita com handlers net/http |
Ambos são orientados a JSON; handlers do Echo retornam error para tratamento centralizado e documentam padrões WebSocket de forma proeminente.
Bind decodifica dados; Validate executa tags de struct através do validador configurado - chame ambos para validação baseada em tags.
Use adaptadores middleware ou envolva com echo.WrapHandler / WrapHandlerFunc para handlers stdlib.
Use httptest com e.ServeHTTP ou echo.New().NewContext com requisições gravadas.
Configure o roteador RedirectTrailingSlash na instância do echo; alinhe com as convenções de URL do cliente.
O middleware de logger padrão escreve linhas no estilo Apache; troque por slog em middleware personalizado para logs estruturados.
Sim - use middleware.Proxy ou confie em X-Forwarded-For cuidadosamente com a configuração de IPExtractor.
e.Static ou e.File registram rotas de arquivo; coloque cabeçalhos de cache em middleware para descarregamento de CDN em produção.
Ao usar StartTLS com a pilha TLS do Go, o HTTP/2 é negociado automaticamente como servidores stdlib.
Use c.Set e c.Get para valores de bag do framework; prefira c.Request().Context() para cancelamento e baggage de tracing.
Monte roteadores chi com WrapHandler em um prefixo de rota wildcard, prestando atenção ao stripping do prefixo do path.
Sim para bordas HTTP/JSON e WebSocket; mantenha chamadas de serviço a serviço em gRPC quando os contratos são internos.
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026