ginutil
Standardized Gin parameter binding.
package main
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
"github.com/mengdu/ginutil"
)
type Foo struct{}
type HelloReq struct {
Name string `query:"name" binding:"required,min=1,max=10"` // e.g: ?name=Tom
}
func (f Foo) Hello(ctx context.Context, req *HelloReq) (string, error) {
return fmt.Sprintf("Hello, %s!", req.Name), nil
}
func apiReply(c *gin.Context, err error, v any) {
if err != nil {
c.JSON(500, gin.H{"ret": -1, "msg": err.Error()})
return
}
c.JSON(200, gin.H{"data": v})
}
func main() {
srv := gin.New()
foo := Foo{}
srv.GET("/hello", ginutil.Handle(apiReply, foo.Hello))
if err := srv.Run("localhost:8080"); err != nil {
panic(err)
}
}
Binding request parameters
// binding from uri string
type UriReq = ginutil.Uri[struct {
A string `uri:"a" binding:"required"` // use `uri` tag for field binding
B int `uri:"b" binding:"min=2,max=10"`
}]
// binding from query string
type QueryReq = ginutil.Query[struct {
A string `query:"a" binding:"required"` // use `query` tag for field binding
B int `query:"b" binding:"min=2,max=10"`
}]
// binding from header
type HeaderReq = ginutil.Header[struct {
A string `header:"a" binding:"required"` // use `header` tag for field binding
B int `header:"b" binding:"min=2,max=10"`
}]
// binding from `application/x-www-form-urlencoded` body
type FormReq = ginutil.Form[struct {
A string `form:"a" binding:"required"` // use `form` tag for field binding
B int `form:"b" binding:"min=2,max=10"`
}]
// binding from `application/form-data` body
type UploadFormReq = ginutil.FormData[struct {
Key string `form:"key" binding:"required"` // use `form` tag for field binding
File *multipart.FileHeader `form:"file" binding:"required"` // file
}]
// binding from `application/json` body
type JsonReq = ginutil.JSON[struct {
A string `json:"a" binding:"required"` // use `json` tag for field binding
B int `json:"b" binding:"min=2,max=10"`
}]
// binding from `application/xml` body
type XmlReq = ginutil.XML[struct {
A string `xml:"a" binding:"required"` // use `xml` tag for field binding
B int `xml:"b" binding:"min=2,max=10"`
}]