// Echo 框架使用指南
// 本文详细介绍如何使用 Echo 框架开发高效的 Go Web 应用程序。
// 1. 引入依赖
// 在项目中引入 Echo 框架。
import (
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"net/http"
"os"
"strconv"
)
func main() {
// 2. 初始化 Echo 实例
e := echo.New()
// 3. 设置全局中间件
// 使用 Logger 中间件记录请求日志
e.Use(middleware.Logger())
// 使用 Recover 中间件自动恢复崩溃
e.Use(middleware.Recover())
// 使用 CORS 中间件,允许跨域请求
e.Use(middleware.CORS())
// 4. 定义路由
// 定义一个简单的 GET 请求处理器
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, Echo!")
})
// 定义一个接收 JSON 请求的 POST 请求处理器
e.POST("/users", func(c echo.Context) error {
// 解析 JSON 数据到结构体
user := new(struct {
Name string `json:"name"`
Email string `json:"email"`
})
if err := c.Bind(user); err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]interface{}{
"message": "User created successfully",
"user": user,
})
})
// 定义一个带路径参数的 GET 请求处理器
e.GET("/users/:id", func(c echo.Context) error {
id := c.Param("id") // 获取路径参数
return c.String(http.StatusOK, "User ID: "+id)
})
// 定义一个带查询参数的 GET 请求处理器
e.GET("/search", func(c echo.Context) error {
query := c.QueryParam("query") // 获取查询参数
return c.String(http.StatusOK, "Search Query: "+query)
})
// 定义一个处理文件上传的 POST 请求处理器
e.POST("/upload", func(c echo.Context) error {
file, err := c.FormFile("file")
if err != nil {
return err
}
return c.String(http.StatusOK, "File uploaded: "+file.Filename)
})
// 定义一个返回服务器状态的路由
e.GET("/status", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{
"status": "running",
"version": "1.0.0",
})
})
// 定义一个使用中间件的路由组
apiGroup := e.Group("/api")
// 使用 BasicAuth 中间件验证用户身份
apiGroup.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
if username == "admin" && password == "secret" {
return true, nil
}
return false, nil
}))
apiGroup.GET("/info", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{
"status": "success",
"message": "Authenticated API access",
})
})
// 定义一个处理错误的示例
e.GET("/error", func(c echo.Context) error {
return echo.NewHTTPError(http.StatusBadRequest, "This is a bad request")
})
// 定义一个计算器服务示例
e.GET("/add", func(c echo.Context) error {
a := c.QueryParam("a")
b := c.QueryParam("b")
intA, err := strconv.Atoi(a)
if err != nil {
return c.String(http.StatusBadRequest, "Invalid parameter 'a'")
}
intB, err := strconv.Atoi(b)
if err != nil {
return c.String(http.StatusBadRequest, "Invalid parameter 'b'")
}
result := intA + intB
return c.JSON(http.StatusOK, map[string]int{
"result": result,
})
})
// 定义一个安全配置的 HTTPS 服务
sslCert := os.Getenv("SSL_CERT_PATH")
sslKey := os.Getenv("SSL_KEY_PATH")
if sslCert != "" && sslKey != "" {
go func() {
if err := e.StartTLS(":443", sslCert, sslKey); err != nil {
e.Logger.Error("Failed to start HTTPS server: ", err)
}
}()
}
// 5. 启动服务器
// 监听指定端口,默认运行在 8080 端口
e.Logger.Fatal(e.Start(":8080"))
}