相關閱讀:
完爆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
專案主頁: github.com/TommyLemon/…
完爆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 則非常簡單方便!
關係型資料庫之所以稱之為“關係”型資料庫,是因為它們能很好地支援【表關聯查詢】。
例如 查詢當前使用者的【全部資訊】和他的前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)