// Package request ... // // Description : request ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2022-07-03 00:33 package request import ( "bytes" "errors" "io/ioutil" "net/http" "strings" "github.com/go-playground/validator/v10" "git.zhangdeman.cn/zhangdeman/gin/define" "github.com/gin-gonic/gin" ) // form 表单相关操作 // // Author : go_developer@163.com<白茶清欢> // // Date : 00:51 2022/7/3 type form struct { checkInstance *validator.Validate } // Parse 解析请求表单 // // Author : go_developer@163.com<白茶清欢> // // Date : 00:34 2022/7/3 func (f *form) Parse(ctx *gin.Context, receiver interface{}) error { var validateFunc = func(parseErr error) error { if nil != parseErr { return parseErr } receiverIsStruct := false switch receiver.(type) { case struct{}: receiverIsStruct = true } if !receiverIsStruct { // 不是结构体,不验证表单 return nil } return f.checkInstance.Struct(receiver) } requestBody, _ := ioutil.ReadAll(ctx.Request.Body) // 请求信息写入上下文 ctx.Set(define.RecordRequestDataField, string(requestBody)) // 因为请求体被读一遍之后就没了,重新赋值 requestBody ctx.Request.Body = ioutil.NopCloser(bytes.NewReader(requestBody)) method := strings.ToUpper(ctx.Request.Method) if method == http.MethodGet || method == http.MethodPatch || method == http.MethodTrace || method == http.MethodConnect || method == http.MethodOptions { return validateFunc(ctx.ShouldBindQuery(receiver)) } if method == http.MethodPost || method == http.MethodPut || method == http.MethodDelete { if ContentType.IsJson(ctx) { return validateFunc(ctx.ShouldBindJSON(receiver)) } if ContentType.IsFormURLEncoded(ctx) { return validateFunc(ctx.ShouldBind(receiver)) } return errors.New(ctx.ContentType() + " is not support") } return errors.New(method + " : request method is not support") }