/* handlers.go - 请求处理器 实现了各种HTTP请求的处理逻辑 */ package server import ( "encoding/json" "net/http" "runtime" "strconv" "time" "webserver/models" "github.com/gorilla/mux" ) // Response 通用响应结构 type Response struct { Status string `json:"status"` Message string `json:"message,omitempty"` Data interface{} `json:"data,omitempty"` Error string `json:"error,omitempty"` Count int `json:"count,omitempty"` } // HealthResponse 健康检查响应 type HealthResponse struct { Status string `json:"status"` Timestamp string `json:"timestamp"` Uptime string `json:"uptime"` Version string `json:"version"` } // StatsResponse 统计信息响应 type StatsResponse struct { Status string `json:"status"` Timestamp string `json:"timestamp"` Uptime string `json:"uptime"` Version string `json:"version"` GoVersion string `json:"go_version"` NumCPU int `json:"num_cpu"` NumGoroutine int `json:"num_goroutine"` MemStats runtime.MemStats `json:"mem_stats"` } var ( startTime = time.Now() version = "1.0.0" ) // HomeHandler 首页处理器 func HomeHandler(w http.ResponseWriter, r *http.Request) { html := ` Go Web服务器

🚀 Go Web服务器

欢迎使用Go语言编写的简单Web服务器!这个项目演示了HTTP服务器、RESTful API、JSON处理等功能。

📚 API接口

GET /health
健康检查
GET /api/stats
服务器统计信息
GET /api/users
获取所有用户
POST /api/users
创建新用户
GET /api/users/{id}
获取指定用户
PUT /api/users/{id}
更新用户信息
DELETE /api/users/{id}
删除用户

🛠️ 使用示例

# 获取所有用户
curl http://localhost:8080/api/users

# 创建新用户
curl -X POST http://localhost:8080/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"张三","email":"zhangsan@example.com","age":25}'

# 健康检查
curl http://localhost:8080/health
        
` w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(http.StatusOK) w.Write([]byte(html)) } // HealthHandler 健康检查处理器 func HealthHandler(w http.ResponseWriter, r *http.Request) { uptime := time.Since(startTime) response := HealthResponse{ Status: "healthy", Timestamp: time.Now().Format(time.RFC3339), Uptime: uptime.String(), Version: version, } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(response) } // StatsHandler 统计信息处理器 func StatsHandler(w http.ResponseWriter, r *http.Request) { uptime := time.Since(startTime) var memStats runtime.MemStats runtime.ReadMemStats(&memStats) response := StatsResponse{ Status: "success", Timestamp: time.Now().Format(time.RFC3339), Uptime: uptime.String(), Version: version, GoVersion: runtime.Version(), NumCPU: runtime.NumCPU(), NumGoroutine: runtime.NumGoroutine(), MemStats: memStats, } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(response) } // GetUsersHandler 获取所有用户 func GetUsersHandler(w http.ResponseWriter, r *http.Request) { users, err := models.GetAllUsers() if err != nil { sendErrorResponse(w, "获取用户列表失败", http.StatusInternalServerError) return } response := Response{ Status: "success", Data: users, Count: len(users), } sendJSONResponse(w, response, http.StatusOK) } // GetUserHandler 获取指定用户 func GetUserHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { sendErrorResponse(w, "无效的用户ID", http.StatusBadRequest) return } user, err := models.GetUserByID(id) if err != nil { sendErrorResponse(w, "用户不存在", http.StatusNotFound) return } response := Response{ Status: "success", Data: user, } sendJSONResponse(w, response, http.StatusOK) } // CreateUserHandler 创建新用户 func CreateUserHandler(w http.ResponseWriter, r *http.Request) { var user models.User if err := json.NewDecoder(r.Body).Decode(&user); err != nil { sendErrorResponse(w, "无效的JSON数据", http.StatusBadRequest) return } // 验证用户数据 if err := user.Validate(); err != nil { sendErrorResponse(w, err.Error(), http.StatusBadRequest) return } // 创建用户 createdUser, err := models.CreateUser(user) if err != nil { sendErrorResponse(w, "创建用户失败", http.StatusInternalServerError) return } response := Response{ Status: "success", Message: "用户创建成功", Data: createdUser, } sendJSONResponse(w, response, http.StatusCreated) } // UpdateUserHandler 更新用户信息 func UpdateUserHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { sendErrorResponse(w, "无效的用户ID", http.StatusBadRequest) return } var user models.User if err := json.NewDecoder(r.Body).Decode(&user); err != nil { sendErrorResponse(w, "无效的JSON数据", http.StatusBadRequest) return } // 设置用户ID user.ID = id // 验证用户数据 if err := user.Validate(); err != nil { sendErrorResponse(w, err.Error(), http.StatusBadRequest) return } // 更新用户 updatedUser, err := models.UpdateUser(user) if err != nil { sendErrorResponse(w, "更新用户失败", http.StatusInternalServerError) return } response := Response{ Status: "success", Message: "用户更新成功", Data: updatedUser, } sendJSONResponse(w, response, http.StatusOK) } // DeleteUserHandler 删除用户 func DeleteUserHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { sendErrorResponse(w, "无效的用户ID", http.StatusBadRequest) return } if err := models.DeleteUser(id); err != nil { sendErrorResponse(w, "删除用户失败", http.StatusInternalServerError) return } response := Response{ Status: "success", Message: "用户删除成功", } sendJSONResponse(w, response, http.StatusOK) } // APIDocHandler API文档处理器 func APIDocHandler(w http.ResponseWriter, r *http.Request) { doc := map[string]interface{}{ "title": "Go Web服务器 API", "version": version, "description": "一个简单的RESTful API服务器", "endpoints": map[string]interface{}{ "health": map[string]string{ "method": "GET", "path": "/health", "description": "健康检查", }, "stats": map[string]string{ "method": "GET", "path": "/api/stats", "description": "服务器统计信息", }, "users": map[string]interface{}{ "list": map[string]string{ "method": "GET", "path": "/api/users", "description": "获取所有用户", }, "get": map[string]string{ "method": "GET", "path": "/api/users/{id}", "description": "获取指定用户", }, "create": map[string]string{ "method": "POST", "path": "/api/users", "description": "创建新用户", }, "update": map[string]string{ "method": "PUT", "path": "/api/users/{id}", "description": "更新用户信息", }, "delete": map[string]string{ "method": "DELETE", "path": "/api/users/{id}", "description": "删除用户", }, }, }, } sendJSONResponse(w, doc, http.StatusOK) } // sendJSONResponse 发送JSON响应 func sendJSONResponse(w http.ResponseWriter, data interface{}, statusCode int) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(statusCode) if err := json.NewEncoder(w).Encode(data); err != nil { http.Error(w, "JSON编码失败", http.StatusInternalServerError) } } // sendErrorResponse 发送错误响应 func sendErrorResponse(w http.ResponseWriter, message string, statusCode int) { response := Response{ Status: "error", Error: message, } sendJSONResponse(w, response, statusCode) }