完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

相关阅读:

完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能

完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制


自APIJSON发布以来,不断有网友拿来和Facebook的GraphQL对比,

甚至有不少人声称“完爆”APIJSON。

然而事实正好相反,本系列博客将以大量真实依据来证明,

APIJSON“完爆”GraphQL!


APIJSON的口号是:

后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构!

APIJSON的简介:

APIJSON是一种为API而生的JSON网络传输协议。

为 简单的增删改查、复杂的查询、简单的事务操作 提供了完全自动化的API。

能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。

适合中小型前后端分离的项目,尤其是互联网创业项目和企业自用项目。

通过自动化API,前端可以定制任何数据、任何结构!

大部分HTTP请求后端再也不用写接口了,更不用写文档了!

前端再也不用和后端沟通接口或文档问题了!再也不会被文档各种错误坑了!

后端再也不用为了兼容旧接口写新版接口和文档了!再也不会被前端随时随地没完没了地烦了!

特点功能

在线解析

自动生成文档,清晰可读永远最新

自动生成请求代码,支持Android和iOS

自动生成JavaBean文件,一键下载

自动管理与测试接口用例,一键共享

自动校验与格式化JSON,支持高亮和收展

对于前端

不用再向后端催接口、求文档

数据和结构完全定制,要啥有啥

看请求知结果,所求即所得

可一次获取任何数据、任何结构

能去除重复数据,节省流量提高速度

对于后端

提供通用接口,大部分API不用再写

自动生成文档,不用再编写和维护

自动校验权限、自动管理版本

开放API无需划分版本,始终保持兼容

支持增删改查、模糊搜索、正则匹配、远程函数等

视频演示:http://i.youku.com/apijson

[以下Gif图看起来比较卡,实际在手机上App运行很流畅] 


项目主页: https://github.com/TommyLemon/APIJSON



完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

DB-Engines 发布了 2018 年 6 月份的数据库排名:

以及它们的历年发展走势:

很明显,Oracle, MySQL, Microsoft SQL Server 常年稳占前三名,

并且大幅超过其他数据库,只有这3个的 Score 在1000以上。

PostgreSQL 近年稳步上升,已跃居第4名。

以上前4大最流行的数据库都有一个共同点 —— 它们都是【关系型数据库】。


APIJSON 和 GraphQL 作为和 HTTP API 相关的通用开源项目,都必须支持 关系型数据库。

然后它们虽然都支持,但 APIJSON “完爆” GraphQL !

用 GraphQL 实现表关联查询是复杂繁琐的,而用 APIJSON 则非常简单方便!


关系型数据库之所以称之为“关系”型数据库,是因为它们能很好地支持表关联查询

例如 查询当前用户的【全部信息】和TA的前5个朋友的【名字】

GraphQL 是这样查的:

{

  user(id: 82001) {

    id

    sex

    name

    tag

    head

    contactIdList

    pictureList

    friends(first: 5) {

      name

    }

  }

}

返回结果是

{

    "data":{

        "user":{

            "id":82001,

            "sex":0,

            "name":"测试改名",

            "tag":"APIJSON User",

            "head":"https://static.oschina.net/uploads/user/19/39085_50.jpg",

            "contactIdList":[

                38710,

                82002,

                82006,

                82030,

                82025,

                82003,

                93793

            ],

            "pictureList":[

                "http://common.cnblogs.com/images/icon_weibo_24.png"

            ],

            "friends":[

                {

                    "name":"TommyLemon"

                },

                {

                    "name":"Happy~"

                },

                {

                    "name":"Wechat"

                },

                {

                    "name":"Meria"

                },

                {

                    "name":"Tommy"

                }

            ]

        }

    }

}

GraphQL 后端怎么知道 user 的类型是 User,friends 的 类型是 User数组 呢?

因为后端提前用大量代码写死了数据结构和解析方式,也就是 Type 和 Schema :

//声明 GraphQLObjectType 类型,包括字段 fields 和解析函数 resolver

var UserType = new GraphQLObjectType({

  name: 'User',

  fields: () => ({

    name: { type: GraphQLString },

    friends: {

      args: {

        first: { type: GraphQLInt }

      },

      type: new GraphQLList(UserType), //声明 friends 的类型是 User 数组

      resolve: (user, { first }) => { //查 friends 的解析函数

        var ids = user.contactIdList == null ? [] : user.contactIdList.join();

        return ctx.db.findAll(

          'SELECT name FROM User WHERE id IN(' + ids + ') LIMIT ' + first

        ).then(rows => rows.map(row => getUserFromRow(row)));

      }

    }

  })

});

//声明结构 Schema,包括 查询结构 Query

export const UserSchema = new GraphQLSchema({

  query: {

    user: {

      type: UserType //声明 me 的类型是 User

      fields: () => ({

        id: { type: new GraphQLNonNull(GraphQLID) },

        sex: { type: GraphQLInt },

        name: { type: GraphQLString },

        tag: { type: GraphQLString },

        head: { type: GraphQLString },

        contactIdList: { type: new GraphQLList(GraphQLID) },

        pictureList: { type: new GraphQLList(GraphQLString) }

      }),

      args: {       

        id: { type: new GraphQLNonNull(GraphQLID) }

      },     

      resolve: ({ id }) => { //查 User 的解析函数

        return ctx.db.findOne(

          'SELECT * FROM User WHERE id = ' + id

        ).then(row => getUserFromRow(row));

      }

    }

  }

});

以上代码是根据官方代码

https://github.com/graphql/graphql-js/blob/master/src/__tests__/starWarsSchema.js

https://github.com/facebook/dataloader

和 http://apijson.org 提供测试的数据库表 来实现的。

GraphQL 用 JavaScript 就这么复杂繁琐了,用 Java,C# 等静态类型语言会麻烦几倍!


APIJSON 是这样查的:

{

  "User": {

    "id": 82001, //查询条件:id = 82001

    "User[]": { //数组,提取里面每一项的 User

      "count": 5, //前 5 条:LIMIT 0, 5

      "User": {

        "id{}@": "User/contactIdList", //在朋友id列表里:id IN contactIdList

        "@column": "name" //只查字段 name: SELECT name

      }

    }

  }

}

或者把 User 数组放到外面减少嵌套层级(不知道GraphQL怎么实现,知道的留个评论谢谢)

{

  "User": {

    "id": 82001   

  },

  "User[]": {

    "count": 5,

    "User": {

      "id{}@": "User/contactIdList",

      "@column": "name"

    }

  }

}

User 数组里每个对象里都只有 name 这一个字段,如果想去掉多余的一层包装,

APIJSON 可以【提取字段】(GraphQL 未提供)

{

  "User": {

    "id": 82001   

  },

  "User-name[]": { //从数组里面每个 User 里取出 name

    "count": 5,

    "User": {

      "id{}@": "User/contactIdList",

      "@column": "name"

    }

  }

}

以上信息已经充分描述了 表、字段、查询条件、表关联方式 等信息。


APIJSON 后端不用写任何代码,

它会【完全自动】地 将以上请求 JSON 自动解析成 SQL 语句

SELECT * FROM User WHERE id = 82001

SELECT name FROM User WHERE id IN ${contactIdList} -- contactIdList从上面的 User 取出

然后【自动执行】并返回对应结构的 JSON 结果!

点左边 [ '/" ] 按钮可以将数组符号 [] 转为单词 List 哦(用 JSONResponse.format 格式化)

注: 以上APIJSON请求都可以在 http://apijson.org 在线工具上测试


后期预告:

完爆Facebook/GraphQL,APIJSON全方位对比解析

—— 数据结构灵活性、接口安全性、接口工具、社区生态、静态类型/强类型 语言 ...



总结

用 GraphQL 实现表关联查询是复杂繁琐的,后端要写大量代码,容易出错、扩展麻烦!

而用 APIJSON 则非常简单方便,后端不用写任何代码,完全自动解析,没有维护成本!


APIJSON,让后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构!

创作不易,右上角点Star支持下吧,非常感谢^_^

https://github.com/TommyLemon/APIJSON (Java Server, Anroid, iOS, JavaScript)

https://github.com/liaozb/APIJSON.NET (C# .NET Core Server)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342