// httpx 包示例:gin 统一响应(OkJson/ErrorJson)、参数绑定(Parse)与业务校验(Validator) package main import ( "fmt" "net/http" "git.zeroonesoft.cn/golib/zogo/httpx" "github.com/gin-gonic/gin" ) // LoginReq 登录请求:Parse 会依次绑定 URI / Query / Header / JSON Body type LoginReq struct { Username string `json:"username" form:"username" uri:"username" header:"X-Username"` Password string `json:"password" form:"password" uri:"password"` } // Validate 实现 httpx.Validator 接口,Parse 绑定完成后自动调用 func (r *LoginReq) Validate() error { if r.Username == "" { return httpx.New(1001, "用户名不能为空") } if r.Password == "" { return httpx.New(1002, "密码不能为空") } return nil } func main() { gin.SetMode(gin.ReleaseMode) r := gin.New() // POST /login/:username?password=xxx 或 POST /login/:username + JSON Body r.POST("/login/:username", func(c *gin.Context) { req := &LoginReq{} if err := httpx.Parse(c, req); err != nil { httpx.ErrorJson(c, err) return } httpx.OkJson(c, gin.H{"welcome": req.Username}) }) r.GET("/ping", func(c *gin.Context) { httpx.OkJson(c, "pong") }) fmt.Println("服务已启动: http://127.0.0.1:8080") fmt.Println("测试: curl -X POST \"http://127.0.0.1:8080/login/admin?password=123456\"") fmt.Println("测试: curl -X POST http://127.0.0.1:8080/login/guest -d '{\"username\":\"\",\"password\":\"\"}'") if err := http.ListenAndServe("127.0.0.1:8080", r); err != nil { fmt.Println("服务退出:", err) } }