在使用Gin的关于参数帮的问题上,比如当我的某个接口必须要都支持GET和HOST的等方法的时候,目前我所直达的方式是:
image.png
但是得再使用的过程中有疑惑的地方是:
参数的多次的绑定的解析的情况,比如,我再自定义的中间件里面也需要获取相关的参数进行参数解析和绑定,在路由API的内部也需要提取参数进行绑定解析到结构体上的时候,就会出现多次绑定的失效的问题。
image.png
中间件内需要绑定的结构体:
image.png
API内需要绑定的结构体:
image.png
如:
POST的情况:
使用application/json进行提交参数内容
ShouldBindJSON--中间件绑定解析后,在下一步的API内在使用ShouldBindJSON的时候就错误了。
需使用:ShouldBindBodyWith 的情况,则两个都可以正常的解析且绑定。
// _ = c.ShouldBindBodyWith(&data, binding.JSON)
PS:多次绑定优先使用 ShouldBindBodyWith 方法 需要多次的绑定解析的情况下
GET的情况下和POST的(application/form-data):
多次绑定的解析则直接的使用:
c.Bind(data)
所以再兼容多种请求的方式下目前只能做类型判断处理
package dginbing
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
//多次绑定的情况处理
func CurrMoreBing(ctx *gin.Context, data interface{}) error {
if ctx.ContentType() == "application/json" {
return ctx.ShouldBindBodyWith(data, binding.JSON)
}
return ctx.Bind(data)
}
调用的地方:
type Parse struct {
Appid string `form:"appid" json:"appid" validate:"required" label:"商户ID"`
Orderid string `form:"orderid" json:"orderid" validate:"required" label:"订单号"`
Timestamp string `form:"timestamp" json:"timestamp" validate:"required" label:"时间戳"`
Mobile string `form:"mobile" json:"mobile" validate:"required" label:"手机号码"`
Sign string `form:"sign" json:"sign" validate:"required" label:"签名"`
ActivityCode string `form:"activity_code" json:"activity_code" validate:"required" label:"活动ID"`
Channeid string `form:"channeid" json:"channeid" label:"渠道id"`
DeviceUserAgent string `form:"device_user_agent" device_user_agent:"price" label:"设备UA"`
Deviceip string `form:"deviceip" json:"deviceip" label:"设备来源IP"`
Deviceid string `form:"deviceid" json:"deviceid" label:"设备来源ID"`
}
var data Parse
//绑定解析的处理====== 多次绑定优先使用 ShouldBindBodyWith 方法 需要多次的绑定解析的情况下
//绑定解析的处理====== 单次绑定使用 ShouldBindJSON 方法
//c.ShouldBindBodyWith(&a, binding.JSON)
//绑定解析的处理====== 多次绑定优先使用 ShouldBindBodyWith 方法 需要多次的绑定解析的情况下
//绑定解析的处理====== 单次绑定使用 ShouldBindJSON 方法
//c.ShouldBindBodyWith(&a, binding.JSON)
// _ = c.ShouldBindBodyWith(&data, binding.JSON)
//POST的情况下 多次的绑定ShouldBind 也会无法获取参数的情况
//c.ShouldBindBodyWith() 会在绑定之前将请求实体存储到上下文中,这对性能有轻微的影响,所以当一次绑定可以完成功能的情况下不要用这个方法;
println("请求头", c.ContentType())
//_ = c.Bind(&data)
//_ = c.Bind(&data)
_ = dginbing.CurrMoreBing(c, &data)
//执行参数的校验
msg, code := validator.Validate(&data, global.ERROR, global.SUCCSE)
网友评论