V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yamedie
V2EX  ›  问与答

这种 graphQL 的接口定义方式是一种好的实践吗?

  •  
  •   yamedie · 2018-09-02 11:33:36 +08:00 · 2928 次点击
    这是一个创建于 2272 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是前端,最近有机会跟一位全栈大牛合作项目,他在项目里用 graphql-java 定义实体的各字段(可能是定义 schema 和 model 吧),用一些注解的方式限制字段的创建修改权限等,然后自动生成了 graphql 和 sql 的 CURD 语句。

    最终提供给前端的接口不是我常见的 restful 接口,而是向一个固定的 /query 接口(增删改是另一个接口)发请求,在 body 中传入一个类似如下的纯文本作为入参:

    {
        goods(page:1,size:10,keyword:cola){
            id
            name
            brand
            desc
        }
        brands(page:1,size:20){
        	id
            name
        }
    }
    

    就能得到以下 json 出参:

    {
        "code": 0,
        "message": "success",
        "data": {
            "goods": [{
                "id": 1,
                "name": "COCA COLA",
                "brand": "COCA COLA CORP.",
                "desc": "blablabla"
             },{
                "id": 2,
                "name": "PEPSI COLA",
                "brand": "PEPSI COLA CORP.",
                "desc": "blablabla"
             }],
             "brands": [{
                "id": 1,
                "name": "COCA COLA CORP.",
             },{
                "id": 2,
                "name": "PEPSI COLA CORP.",
             }{
                "id": 3,
                "name": "WAHAHA CORP.",
             }]
        }
    }
    

    我认为这种接口定义方式,等同于让前端自己写 SQL 语句,想查什么自己写入参就好了,将海量的自由度赋予了前端。虽然减轻了后台写 CURD 接口的负担,但我觉得可能会带来更多的问题和隐患。

    具体有什么问题我也说不好,只提了 2 个问题。一个是如何防范前端非授权访问,影响数据库性能,或者篡改数据?另一个是怎么抵御别人爬数据库?大牛用限制访问频次、“特殊字段根据请求角色过滤”、数据库内存缓存、“特殊接口仍需自己写”等把我的问题顶回去了。。

    我想问的是,这种接口定义方式是一种好的实践吗?哪些大厂在这么用?

    3 条回复    2018-09-03 09:40:20 +08:00
    zhzer
        1
    zhzer  
       2018-09-02 11:40:06 +08:00 via Android
    github 在用,只能说好处比坏处多,适合社交网络
    artikle
        2
    artikle  
       2018-09-02 19:14:09 +08:00
    这个是 Facebook 推的,github 在用+1
    Smilecc
        3
    Smilecc  
       2018-09-03 09:40:20 +08:00   ❤️ 1
    首先 GraphQL 完全不等同于让前端自己写 SQL 语句,因为数据的组织还是来自于后端,后端仍然有绝对的数据控制权。
    对于授权的问题,我的实践是这方面可以和 JWT 结合,把用户角色写入 token 中,在特殊字段 resolve 之前鉴权。
    性能的问题,我认为使用 GraphQL 确实一定程度上会降低程序的性能,但可以通过加机器解决嘛,好处大于坏处吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:45 · PVG 05:45 · LAX 13:45 · JFK 16:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.