有没有什么优雅的方法实现 当 req.xx == yy 时 某些参数必须 或转成其他 struct

70 天前
 dzdh

一个 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)

1517 次点击
所在节点    Go 编程语言
9 条回复
gam2046
70 天前
唔,我重复看了两遍,可是没看懂,你想要表达的意思。
0o0O0o0O0o
70 天前
0o0O0o0O0o
70 天前
henix
70 天前
somekey, somekey2 的类型改为自己实现的 json.Unmarshaler 然后外面加上自定义验证逻辑?
Ayanokouji
70 天前
要优雅的话,可以用 cue
https://cuelang.org/
424778940
69 天前
不太理解这个需求, 为什么要求"必须不传"?

不然直接用 protobuf3 不好吗?
dzdh
69 天前
@424778940

某种程度上来说,就是降低心智负担。某个 channel 的参数白名单是什么,这个 channel 下,其他参数,是不能游泳的,不生效的,所以,干脆就不要传。

http json api 。不想引入太多新东西。
qh666
69 天前
使用 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 账号密码登录
}
424778940
69 天前
@dzdh 这两个并不冲突啊

不能有用的参数接收方不处理不就完了, 不然调用方还要特地区分每个情况下哪个参数能不能传才是心智负担吧

不想引入太多东西往往意味着要自己写更多的东西重新实现现成的轮子的一部分

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055727

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX