Echo: Ecosistema de Middleware y Envoltorio de Contexto
Echo es un framework HTTP completo centrado en echo.Context, un pipeline de middleware con Next(), y soporte de primera clase para binding, validación y WebSockets.
Busca en todas las páginas de la documentación
Echo es un framework HTTP completo centrado en echo.Context, un pipeline de middleware con Next(), y soporte de primera clase para binding, validación y WebSockets.
Está dirigido a equipos que construyen APIs JSON y endpoints en tiempo real que desean la ergonomía del framework con una superficie más pequeña que algunas alternativas.
Los manejadores de Echo tienen la firma func(c echo.Context) error.
Devolver un error delega a HTTPErrorHandler, permitiendo sobres de error JSON consistentes.
El middleware se compone como echo.MiddlewareFunc, y el framework incluye middleware de logging, recuperación, CORS y ID de solicitud en su ecosistema.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
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)
})Cuándo usar esto:
error devueltosNext() explícito de middleware sobre solo manejadores envoltoriopackage 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 {
// Conectar github.com/go-playground/validator en producción
return nil
}Lo que esto demuestra:
Bind para cuerpos JSON y hook Validate separadoerror con echo.NewHTTPErrorecho.New() crea un motor con ranuras para router, binder y validador.c.Next() continúa la cadena hasta que se ejecuta el manejador de ruta.echo.Context incrusta accesores para http.ResponseWriter y *http.Request (Request(), Response()).Start y StartTLS lanzan http.Server con Echo como manejador.| Familia de métodos | Propósito |
|---|---|
Param, QueryParam, FormValue | Leer entradas |
Bind | Decodificar cuerpo/consulta/ruta en structs |
JSON, String, Blob, File | Escribir respuestas |
Redirect, NoContent | Controlar estado y encabezados |
Echo, Path, RealIP | Metadatos del framework |
Echo proporciona helpers de actualización echo.Context (a través de patrones y middleware de golang.org/x/net/websocket).
Úselo para notificaciones, chat o streaming cuando el sondeo HTTP largo sea insuficiente.
Mantenga explícito el ciclo de vida de la conexión y la autenticación en el momento de la actualización.
// Custom HTTPErrorHandler para errores de 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 errores evita filtrar trazas de pila en respuestas de producción.
c.Validate no hace nada hasta que se establece e.Validator. Solución: registrar el adaptador go-playground/validator en main.HTTPErrorHandler. Solución: devolver errores antes de escribir cuerpos o verificar c.Response().Committed.Bind fusiona fuentes - Bind puede poblar desde la ruta, consulta y cuerpo; sobrescrituras inesperadas si las etiquetas se superponen. Solución: usar opciones de Bind o métodos de bind separados por fuente.e.Group con middleware por grupo para límites de autenticación.err.Error() crudo a los clientes filtra internos. Solución: mapear a códigos externos estables en HTTPErrorHandler.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Gin | Ecosistema de plugins más grande y velocidad JSON similar | Quieres el estilo de manejo de errores de retorno de error de Echo |
| chi | Portabilidad de http.Handler de stdlib | Quieres helpers integrados de bind/validate/WebSocket |
| net/http + gorilla/websocket | Dependencias mínimas | Prefieres middleware integrado de Echo |
| Fiber | HTTP rápido no estándar | Necesitas interoperabilidad estricta de manejadores net/http |
Ambos están orientados a JSON; los manejadores de Echo devuelven error para un manejo centralizado y documentan prominentemente los patrones WebSocket.
Bind decodifica datos; Validate ejecuta etiquetas de struct a través del validador configurado - llama a ambos para validación basada en etiquetas.
Usa adaptadores middleware o envuelve con echo.WrapHandler / WrapHandlerFunc para manejadores stdlib.
Usa httptest con e.ServeHTTP o echo.New().NewContext con solicitudes grabadas.
Configura RedirectTrailingSlash del router en la instancia de echo; alinea con las convenciones de URL del cliente.
El middleware de logger predeterminado escribe líneas estilo Apache; cambia a slog en middleware personalizado para logs estructurados.
Sí - usa middleware.Proxy o confía en X-Forwarded-For cuidadosamente con la configuración de IPExtractor.
e.Static o e.File registran rutas de archivos; coloca encabezados de caché en el middleware para descarga de CDN en producción.
Al usar StartTLS con la pila TLS de Go, HTTP/2 se negocia automáticamente como los servidores stdlib.
Usa c.Set y c.Get para valores de bolsa del framework; prefiere c.Request().Context() para cancelación y equipaje de rastreo.
Monta routers chi con WrapHandler en un prefijo de ruta comodín, teniendo en cuenta la eliminación del prefijo de ruta.
Sí para bordes HTTP/JSON y WebSocket; mantén las llamadas de servicio a servicio en gRPC cuando los contratos sean internos.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (Predeterminado GC de Green Tea, modernizadores de go fix - verificar parche en la compilación), chi (última versión - verificar en la compilación), gin (última versión - verificar en la compilación), echo (última versión - verificar en la compilación), google.golang.org/grpc (última versión - verificar en la compilación), sigs.k8s.io/controller-runtime (última versión - verificar en la compilación), kubebuilder (última versión - verificar en la compilación), tinygo (última versión - verificar objetivos de placa en la compilación), wazero (última versión - verificar en la compilación), y golangci-lint (última versión - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026