美文网首页
GIN下关于参数的多次绑定问题

GIN下关于参数的多次绑定问题

作者: 小钟钟同学 | 来源:发表于2020-09-29 15:15 被阅读0次

    在使用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)
    

    相关文章

      网友评论

          本文标题:GIN下关于参数的多次绑定问题

          本文链接:https://www.haomeiwen.com/subject/jyseuktx.html