关于golang的kratos框架处理http请求空值的办法

背景

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层拿到的结构体中数据。

如果以上文档有写的不足之处,希望各位大佬们批评指正

参考文档

HTTP | Kratos

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值