一、问题
正常这个问题的解决方案:将获取json的结构体成员变量都改为大写,一般能解决90%的问题,但是我这里是自身的问题或者和公司有关。
代码:
var param SourceParam
cgtx := c.GinContext
if err := cgtx.ShouldBind(¶m); err != nil {
logs.CtxWarn(cgtx, "[xx] bind common_param error err=%+v", err)
return response.NewBadJsonOutput(c, err.Error(), "初始化参数错误")
}
在公司接口获取json数据时,首先是Field validation for ‘DateType’ failed on the ‘required’ tag出现错误,原因是DateType设定为required,所以会去校验搞参数是否存在。
在出现该问题后,我将binding:"required"
去掉,但是发现后面依然会错误,解析出的param参数都是空的数据。
通过寻求网络帮助,发现都没有我所需要的,都是说参数要大写表示是public,而我代码是符合的。也就是说网络上的解决方案都没有和我一样的。所以,我觉得可能是其它参数的问题,于是乎一顿魔改加对比其他接口,发现问题所在。
将ShouldBind
修改为ShouldBindJSON
后问题瞬间解决,可以说是非常简单但是正常人是不太可能想到的。因为这是公司老代码,我寻思既然在线上能够正常运行,我根本无需修改它,所以也就不会想到这个问题。
但是确实,ShouldBind
就无法绑定得到数据,所以我怀疑是gin框架源码里的限制,当然公司里应该是基于gin修改的框架,所以在里面某个位置做了限制操作。
二、反思
一般来说,对于老代码,我们都不会去修改它,非常确信它是对的,但是随着时间流逝,老的框架和代码不断被新代码冲击,可能就会失去它原有的意义。而后来人修改新的代码,加入新的限制,可能老的逻辑和思路就行不通了,所以在遇到玄学问题的时候,最好思考其它方面,可能就一些小细节导致了错误。