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

2020-05-17 12:41:15 +08:00
 Wenco

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

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

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

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

6903 次点击
所在节点    Go 编程语言
44 条回复
wfhtqp
2020-05-18 08:41:51 +08:00
使用 tag+reflect,根据请求 fields 返回需要的字段
Wenco
2020-05-18 08:52:24 +08:00
@renmu 很多种情况下都会出现操作的数据对象是一样的,就是需要的字段不同,不 select * 每个地方都要写一次,代码复用超级低。其实 OOP 思想也会有类似的问题,看怎么取舍了。
Wenco
2020-05-18 08:55:48 +08:00
@JackyCDK 前台要求不展示 password,但是后台需要 password 怎么搞?写两个不同的 struct 然后转换?
Wenco
2020-05-18 08:57:48 +08:00
@k9982874 https://gorm.io/docs/query.html 不需要用 map 啊,创建好表 struct 就行了
useben
2020-05-18 09:06:10 +08:00
dto vo po
reus
2020-05-18 09:06:25 +08:00
如果出什么 bug,密码泄露到前台,你就知错了。

好的设计,就算出现 bug,也不至于出现敏感数据泄露。

安全距离是很重要的,你这种做法,不安全。
Wenco
2020-05-18 09:07:04 +08:00
@wfhtqp 能贴一下做的比较好示例代码或示例项目吗?
Wenco
2020-05-18 09:08:38 +08:00
@reus 正在写的过程中,我知道这样做肯定是不好的,所以来这里寻求比较好(方便,高效)的解决方案
dandycheung
2020-05-18 09:10:21 +08:00
一楼正解。
siteshen
2020-05-18 09:45:34 +08:00
// models/user.go
struct User {
username string
password stirng
age int
...
}

// responses/user.go
struct UserResponse {
username string
age int
...
}

func NewUserResponse(user *User) {
...
}

// handlers/user.go
funct ReadUserHandler(req, res) {
user = models.ReadUserById(req.UserId)
return response.NewUserResponse(user)
}
siteshen
2020-05-18 09:49:37 +08:00
@siteshen 简单的说,就是你们少了一层抽象:API response 。加上之后 API 返回字段就只和 API response 层相关,不需要和 model 、logic 层耦合(甚至 model 用 ORM 实现、甚至存储换成 redis/mongodb 也不会影响前端)。
wfhtqp
2020-05-18 09:57:06 +08:00
Wenco
2020-05-18 10:00:21 +08:00
@siteshen 是不是可以理解为 response 就是定义数据返回格式的,有几处不同的返回格式就定义几个 response,NewRespons 没有实际输出,只是进行数据重组?
odirus
2020-05-18 10:10:34 +08:00
举个例子,假设需要分别返回“课程信息”给 PC 端和 APP 端,他们需要返回的字段详细程度是不一样的,可以这样做

查询课程 ID -> 查询出该课程的详细信息 -> 缓存到某个地方(例如 ES ) -> 通过 Graphql 分别取各个端需要的字段信息 -> 返回给端

更新课程 ID -> 更新 DB 中的课程信息 -> 更新 ES 中的课程信息
Pythondr
2020-05-18 10:13:08 +08:00
不建议将数据库的 model 直接返回, 一般会定义一个 controller 层的 model, 这样的数据字段更具有灵活性,也更安全
Wenco
2020-05-18 10:16:27 +08:00
@odirus 这么多人推荐 Graphql,很有诱惑力
ViggoSite
2020-05-18 10:22:52 +08:00
指定 Select 字段,它不香麽?
ZSeptember
2020-05-18 10:24:35 +08:00
VO,DTO,各种结构职责分离
misaka19000
2020-05-18 10:25:58 +08:00
添加 exclude 或者 include 选项
pena
2020-05-18 15:05:35 +08:00
https://github.com/pengwenwu/gin-items

不介意的话可以看下我自己写的小项目,基于 gin 的 restfull 风格的商品服务。

不定字段可以通过 scan 转到 map 里,不过性能会有影响

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

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

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

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

© 2021 V2EX