api 数据返回过滤不需要的字段

2020 年 5 月 17 日
 Wenco

目前在用 gin+gorm 写一个小玩意,遇到这样的情况:

为了代码复用及写起来方便,基本都是用的 orm select *

有时候面向前台的接口不方便展示数据集中的某个字段,但是面向后端的又需要

这应该是前后端分离都会遇到的吧,请教各位大佬,比较好的解决方案是什么?

7720 次点击
所在节点    Go 编程语言
44 条回复
hq
2020 年 5 月 17 日
heimeil
2020 年 5 月 17 日
type User struct {
Name string `json:"name"`
Password string `json:"-"`
}
Wenco
2020 年 5 月 17 日
@hq 感谢,目前用的 restful api,我了解一下
Wenco
2020 年 5 月 17 日
@heimeil 重写一个结构体,然后将查询出来的 model 数据转移吗。
kasper4649
2020 年 5 月 17 日
DTO ?
pubby
2020 年 5 月 17 日
var u User =.....

//举例:隐藏 User 里的 password

var out = struct{
User
Hide1 bool `json:"password,omitempty"`
}{
User: u,
}

json.Marshal(out)

//原理:利用 omitempty 属性的空值同名字段覆盖
CEBBCAT
2020 年 5 月 17 日
这个 Google 一下就有了吧。可以重新定义结构体的 JSON 相关方法
qiayue
2020 年 5 月 17 日
后端处理后再返回,每一个字段都要处理,确保返回的数字是数字,字符是字符。
另外很多时候还会返回对象,举例帖子详情接口,返回的 author 就需要是一个对象,方便展示昵称和头像
{
"id": 123,
"title": "帖子标题",
"author":{
"id": 456,
"name": "帖子作者昵称",
"avatar": "帖子作者头像 URL"
}
}
Wenco
2020 年 5 月 17 日
@CEBBCAT 提问前 google 过,看你的描述应该说的和我看的那个一样,我感觉不太灵活。
Wenco
2020 年 5 月 17 日
@pubby 嗯,感觉这个挺好的
JackyCDK
2020 年 5 月 17 日
json: - , binding: password,required
renmu
2020 年 5 月 17 日
都是 select * 会被骂的吧😂😂性能有问题
securityCoding
2020 年 5 月 17 日
@renmu 表设计好,索引用好并不会有什么问题...
GM
2020 年 5 月 17 日
很简单,换 PHP 就好了!(* ̄ rǒ ̄)
winrar
2020 年 5 月 18 日
这个 ORM 都有的吧,比如 django 的 values(fields, *expressions)
winrar
2020 年 5 月 18 日
@winrar 看错了,此条无视
ppphp
2020 年 5 月 18 日
我的实践上还是返回的 model 和数据表的 model 会转一下,方便点,改表也没有心理压力
baobao1270
2020 年 5 月 18 日
.NET 有 DTO,其他语言应该也有类似的,思路就是用中间类转换一下
k9982874
2020 年 5 月 18 日
先不说 select *的问题,你是把数据直接怼进 map 里?
Counter
2020 年 5 月 18 日
创建一个专门用于输出数据的类,不要直接输出实体

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

https://study.congcong.us/t/672543

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

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

© 2021 V2EX