相关阅读:javascript
完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能前端
完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制
java
自APIJSON发布以来,不断有网友拿来和Facebook的GraphQL对比,git
甚至有很多人声称“完爆”APIJSON。github
然而事实正好相反,本系列博客将以大量真实依据来证实,数据库
APIJSON“完爆”GraphQL!json
APIJSON的口号是:后端
后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构!api
APIJSON的简介:数组
APIJSON是一种为API而生的JSON网络传输协议。
为 简单的增删改查、复杂的查询、简单的事务操做 提供了彻底自动化的API。
能大幅下降开发和沟通成本,简化开发流程,缩短开发周期。
适合中小型先后端分离的项目,尤为是互联网创业项目和企业自用项目。
经过自动化API,前端能够定制任何数据、任何结构!
大部分HTTP请求后端不再用写接口了,更不用写文档了!
前端不再用和后端沟通接口或文档问题了!不再会被文档各类错误坑了!
后端不再用为了兼容旧接口写新版接口和文档了!不再会被前端随时随地没完没了地烦了!
视频演示:http://i.youku.com/apijson
项目主页: github.com/TommyLemon/…
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请求均可以在 apijson.org 在线工具上测试
后期预告:
完爆Facebook/GraphQL,APIJSON全方位对比解析
—— 数据结构灵活性、接口安全性、接口工具、社区生态、静态类型/强类型 语言 ...
总结
用 GraphQL 实现表关联查询是复杂繁琐的,后端要写大量代码,容易出错、扩展麻烦!
而用 APIJSON 则很是简单方便,后端不用写任何代码,彻底自动解析,没有维护成本!
APIJSON,让后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构!
创做不易,右上角点Star支持下吧,很是感谢^_^
github.com/TommyLemon/… (Java Server, Anroid, iOS, JavaScript)
github.com/liaozb/APIJ… (C# .NET Core Server)