api 数据返回过滤不需要的字段
目前在用 gin+gorm 写一个小玩意,遇到这样的情况:
为了代码复用及写起来方便,基本都是用的 orm select *
有时候面向前台的接口不方便展示数据集中的某个字段,但是面向后端的又需要
这应该是前后端分离都会遇到的吧,请教各位大佬,比较好的解决方案是什么?
目前在用 gin+gorm 写一个小玩意,遇到这样的情况:
为了代码复用及写起来方便,基本都是用的 orm select *
有时候面向前台的接口不方便展示数据集中的某个字段,但是面向后端的又需要
这应该是前后端分离都会遇到的吧,请教各位大佬,比较好的解决方案是什么?
//举例:隐藏 User 里的 password
var out = struct{
User
Hide1 bool `json:”password,omitempty”`
}{
User: u,
}
json.Marshal(out)
//原理:利用 omitempty 属性的空值同名字段覆盖
好的设计,就算出现 bug,也不至于出现敏感数据泄露。
安全距离是很重要的,你这种做法,不安全。
// 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)
}
查询课程 ID -> 查询出该课程的详细信息 -> 缓存到某个地方(例如 ES ) -> 通过 Graphql 分别取各个端需要的字段信息 -> 返回给端
更新课程 ID -> 更新 DB 中的课程信息 -> 更新 ES 中的课程信息
不介意的话可以看下我自己写的小项目,基于 gin 的 restfull 风格的商品服务。
不定字段可以通过 scan 转到 map 里,不过性能会有影响
UserResponse 也是可以复用的,下面这个例子就会复用 BasicUser 。
用户列表可能就只需要 BasicUser (用户名、头像),
查看用户详情时可能需要 UserDetail (BasicUser + 粉丝数、文章数),
查看自己的详情时可能需要 Me ( UserDetail + 收入 + 草稿箱中的文章数)。
struct BasicUser {
username string
avatar url
}
// API readUser
struct UserDetail {
UserResponse
bio string
location string
n_follower int
n_following int
n_posts int
}
// 用户查看自己信息的时
struct Me {
UserDetail
n_fav_posts int
total_cost double
total_income double
n_draft_posts int
}
// API listUser
struct UserList {
users BasicUser[]
}