一个 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方法。如果方法多了维护是个问题。
有什么好的方案吗
|      1gam2046      2024-07-08 18:06:07 +08:00  1 唔,我重复看了两遍,可是没看懂,你想要表达的意思。 | 
|      20o0O0o0O0o      2024-07-08 18:35:28 +08:00 | 
|      30o0O0o0O0o      2024-07-08 18:40:47 +08:00  1 | 
|      4henix      2024-07-08 18:56:57 +08:00 somekey, somekey2 的类型改为自己实现的 json.Unmarshaler 然后外面加上自定义验证逻辑? | 
|      5Ayanokouji      2024-07-08 21:30:49 +08:00 要优雅的话,可以用 cue https://cuelang.org/ | 
|  |      6424778940      2024-07-09 09:42:46 +08:00 不太理解这个需求, 为什么要求"必须不传"? 不然直接用 protobuf3 不好吗? | 
|  |      7dzdh OP @424778940  某种程度上来说,就是降低心智负担。某个 channel 的参数白名单是什么,这个 channel 下,其他参数,是不能游泳的,不生效的,所以,干脆就不要传。 http json api 。不想引入太多新东西。 | 
|  |      8qh666      2024-07-09 10:37:50 +08:00 使用 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 账号密码登录 } |