一个 api 中转系统
当 body json channel==app1 时,data.somekey required 。否则 [必须不传]
其他类似 channel=app2 时 data.somekey2 required 否则 [必须不传]
现在是这么干的
type tmp struct { C string json:"channel"
}
gin.get("/", func... c.bind(C) switch(channel) case xx: return new ChannelXX(c.req)
没写完 继续贴
不同的channel有对应不同的process方法
比如 func channelAProcess(name, price, attr string) func channelBProcess(name, attr)
req里对应的channel,获取指定的对应需要的参数 然后调用对应的channelprocess方法。如果方法多了维护是个问题。
有什么好的方案吗
1
gam2046 61 天前 ![]() 唔,我重复看了两遍,可是没看懂,你想要表达的意思。
|
2
0o0O0o0O0o 61 天前
|
3
0o0O0o0O0o 61 天前 ![]() |
4
henix 61 天前
somekey, somekey2 的类型改为自己实现的 json.Unmarshaler 然后外面加上自定义验证逻辑?
|
5
Ayanokouji 61 天前
要优雅的话,可以用 cue
https://cuelang.org/ |
![]() |
6
424778940 60 天前
不太理解这个需求, 为什么要求"必须不传"?
不然直接用 protobuf3 不好吗? |
![]() |
7
dzdh OP @424778940
某种程度上来说,就是降低心智负担。某个 channel 的参数白名单是什么,这个 channel 下,其他参数,是不能游泳的,不生效的,所以,干脆就不要传。 http json api 。不想引入太多新东西。 |
![]() |
8
qh666 60 天前
使用 https://github.com/go-playground/validator 校验即可
类似于这种接第三方 api 的应用推荐使用 github.com/go-resty/resty 个人建议是早期先引入此类成熟的工具库,否则后期不好改动,只能硬着头皮去维护了 参考 validated.BindAndValidatePostJson() type LoginReq struct { Phone string `json:"phone" binding:"omitempty,required_if=Type 1,required_if=Type 2,phone,len=11"` // 手机号 Type int `json:"type" binding:"required,oneof=1 2 3 4"` // 1 短信验证码登录 2 账号密码登录 } |