关于数据聚合与 graphQL 的使用
有个需求,比如我通过 userid 查数据库映射到 userBean 中,然后我还需要通过 userBean 中传回来的内容中的 groupId 查数据库映射到 groupBean 中。这个时候我可以获取到两个 java 对象( user 、group )。 普遍的做法是将两个对象塞到一个 List 中,返回给前端,前端自己过滤和拼装渲染。 其实前端想要是一个聚合后的 json 。 比如按照之前的做法我们返回给前端的 json 是这样的: { "user": { "userid": 111, "name": "张三", "age": "12", "sex": "男" }, "group": { "groupid": 222, "name": "学习组", "des": "学习小组" } }
但是现在前端想要的格式其实是 { "user": { "userid": 111, "name": "学习组", "age": "12", "sex": "男", "groupid": 222 } }
当然服务端可以通过定义一个只包含这些字段的 bean 出来,然后将两次查询到的结果分别 set 进去。但是这样会造成产生了很多返回结构体的 bean 出现。
目前了解了一下 graphQL,但是感觉后端加入这个框架写的很麻烦,网上没有太多 springboot+graphQL 的 demo 。而且感觉写法也不太简单,可能是我太菜的原因。
问下大家,后端实现数据聚合还有哪些思路? 或者是使用 graphQL 有哪些 demo 可以参考。今天看这块内容已经自闭一天了。
----------------------- 以下是精选回复-----------------------
答:这种需求 GraphQL 可以直接解决。你定义 GraphQL 对象的时候直接用 User 里面嵌套一个 Group,前端需要从 User 里面获取所属 Group 的时候直接拿这个对象就可以了,GraphQL 会给它填进去。
当然很多时候你需要自己写 DataLoader 。
你如果不能用纯 Rest API 完成接口设计,那么多数是前端需要依靠后端来聚合数据。大概率是因为性能原因没办法在前端做聚合。GraphQL 本身可以帮你做一些简单的聚合,同时也可以直接减少请求次数。但是最终你很可能还是要自己写一些 DataLoader 或者构造一些用来做 VM 的 Graph Type 。
对于后端来说,用 GraphQL 不会带来太多便利,该写的还是要写。只是前端可以一定程度上自行决定返回的数据结构,你也省了很多沟通成本,提升的是整个项目的效率。
答:私以为,GraphQL 不是给后端用的,而是应该由前端自己写的。
现在的前端早已不是那个切图仔了,大前端至少要负责到直接对外暴露的 API 那一级
答:graphql 的格式就是前者,而不是后者。
答:就像你上面说的,可以再映射一下数据格式,其实这很好的方案,graphql 直接给前端也有其它的坏处,中间加一层可以解决不少问题。而且这些映射有现成的工具可以配置。
答:java 里似乎没什么好方案,我们这边全转到 node.js ,用 Apollo 了
0条评论