背景
kratos脚手架生成的pb.go文件的结构体会给生成的 json tag 加上 omitempty,当我们http请求传入空值字段的时候,http将请求json反序列化到生成的结构体中是不会有空值字段的。但是有时候我们需要对空值情况进行操作,而又不知道是否是传入的空值还是没有传这个字段,非常恼火。
proto文件定义的message
pb.go文件生成的结构体
传入的http请求
service层打印httpRequest发现没有 "sex" 字段
解决办法
通过自定义http的RequestDecoder()即可实现
具体操作
先定义一个RequestDecoder()函数,这点可以详见kratos的http的DefaultRequestDecoder()
下面展示我写的RequestDecoder方法
其中主要的思想就是将读取到的request请求body解码到map中,遍历map判断哪些字段存在,或者可以拿到空值或者0值对应的字段是什么,从而可以对其进行操作。操作完成之后将新的map进行json序列化,然后反序列化到你自定义的message结构体中,就可以得到你想要的结果
该方法具体生效的地方在server文件夹的http.go中,如下图
总结
1.定义RequestDecoder函数
2.在server的http层进行引入
RequestDecoder函数中处理逻辑
1.将请求body解码到你方便处理数据的结构中,这点我是解码到map中进行操作
2.根据你的结构进行数据处理,这里我是遍历map拿到空值,给空值字段赋予null
3.将处理后的结构进行json序列化成byte数组
4.将序列化后的byte数组进行反序列化到你自定义的message请求结构中
5.在service层你拿到的message请求结构的值就是你处理后的值
具体成果展示
上图中的tempMap就是读到的http请求body,tempByte是处理后的body,in是service层拿到的结构体中数据。
如果以上文档有写的不足之处,希望各位大佬们批评指正