摘要:相關(guān)閱讀完爆,全方位對(duì)比解析一基礎(chǔ)功能完爆,全方位對(duì)比解析二權(quán)限控制自發(fā)布以來(lái),不斷有網(wǎng)友拿來(lái)和的對(duì)比,甚至有不少人聲稱完爆。近年穩(wěn)步上升,已躍居第名。
相關(guān)閱讀:
完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析(一)-基礎(chǔ)功能
完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析(二)-權(quán)限控制
自APIJSON發(fā)布以來(lái),不斷有網(wǎng)友拿來(lái)和Facebook的GraphQL對(duì)比,
甚至有不少人聲稱“完爆”APIJSON。
然而事實(shí)正好相反,本系列博客將以大量真實(shí)依據(jù)來(lái)證明,
APIJSON“完爆”GraphQL!
APIJSON的口號(hào)是:
后端接口和文檔自動(dòng)化,前端(客戶端) 定制返回JSON的數(shù)據(jù)和結(jié)構(gòu)!
APIJSON的簡(jiǎn)介:
APIJSON是一種為API而生的JSON網(wǎng)絡(luò)傳輸協(xié)議。
為 簡(jiǎn)單的增刪改查、復(fù)雜的查詢、簡(jiǎn)單的事務(wù)操作 提供了完全自動(dòng)化的API。
能大幅降低開(kāi)發(fā)和溝通成本,簡(jiǎn)化開(kāi)發(fā)流程,縮短開(kāi)發(fā)周期。
適合中小型前后端分離的項(xiàng)目,尤其是互聯(lián)網(wǎng)創(chuàng)業(yè)項(xiàng)目和企業(yè)自用項(xiàng)目。
通過(guò)自動(dòng)化API,前端可以定制任何數(shù)據(jù)、任何結(jié)構(gòu)!
大部分HTTP請(qǐng)求后端再也不用寫(xiě)接口了,更不用寫(xiě)文檔了!
前端再也不用和后端溝通接口或文檔問(wèn)題了!再也不會(huì)被文檔各種錯(cuò)誤坑了!
后端再也不用為了兼容舊接口寫(xiě)新版接口和文檔了!再也不會(huì)被前端隨時(shí)隨地沒(méi)完沒(méi)了地?zé)┝耍?/p>
特點(diǎn)功能
在線解析
自動(dòng)生成文檔,清晰可讀永遠(yuǎn)最新
自動(dòng)生成請(qǐng)求代碼,支持Android和iOS
自動(dòng)生成JavaBean文件,一鍵下載
自動(dòng)管理與測(cè)試接口用例,一鍵共享
自動(dòng)校驗(yàn)與格式化JSON,支持高亮和收展
對(duì)于前端不用再向后端催接口、求文檔
數(shù)據(jù)和結(jié)構(gòu)完全定制,要啥有啥
看請(qǐng)求知結(jié)果,所求即所得
可一次獲取任何數(shù)據(jù)、任何結(jié)構(gòu)
能去除重復(fù)數(shù)據(jù),節(jié)省流量提高速度
對(duì)于后端提供通用接口,大部分API不用再寫(xiě)
自動(dòng)生成文檔,不用再編寫(xiě)和維護(hù)
自動(dòng)校驗(yàn)權(quán)限、自動(dòng)管理版本
開(kāi)放API無(wú)需劃分版本,始終保持兼容
支持增刪改查、模糊搜索、正則匹配、遠(yuǎn)程函數(shù)等
視頻演示:http://i.youku.com/apijson
[以下Gif圖看起來(lái)比較卡,實(shí)際在手機(jī)上App運(yùn)行很流暢]
項(xiàng)目主頁(yè): https://github.com/TommyLemon/APIJSON
完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析(三)-表關(guān)聯(lián)查詢DB-Engines 發(fā)布了 2018 年 6 月份的數(shù)據(jù)庫(kù)排名:
以及它們的歷年發(fā)展走勢(shì):
很明顯,Oracle, MySQL, Microsoft SQL Server 常年穩(wěn)占前三名,
并且大幅超過(guò)其他數(shù)據(jù)庫(kù),只有這3個(gè)的 Score 在1000以上。
PostgreSQL 近年穩(wěn)步上升,已躍居第4名。
以上前4大最流行的數(shù)據(jù)庫(kù)都有一個(gè)共同點(diǎn) —— 它們都是【關(guān)系型數(shù)據(jù)庫(kù)】。
APIJSON 和 GraphQL 作為和 HTTP API 相關(guān)的通用開(kāi)源項(xiàng)目,都必須支持 關(guān)系型數(shù)據(jù)庫(kù)。
然后它們雖然都支持,但 APIJSON “完爆” GraphQL !
用 GraphQL 實(shí)現(xiàn)表關(guān)聯(lián)查詢是復(fù)雜繁瑣的,而用 APIJSON 則非常簡(jiǎn)單方便!
關(guān)系型數(shù)據(jù)庫(kù)之所以稱之為“關(guān)系”型數(shù)據(jù)庫(kù),是因?yàn)樗鼈兡芎芎玫刂С?strong>【表關(guān)聯(lián)查詢】。
例如 查詢當(dāng)前用戶的【全部信息】和TA的前5個(gè)朋友的【名字】
GraphQL 是這樣查的:
{ user(id: 82001) { id sex name tag head contactIdList pictureList friends(first: 5) { name } } }
返回結(jié)果是
{ "data":{ "user":{ "id":82001, "sex":0, "name":"測(cè)試改名", "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 的類(lèi)型是 User,friends 的 類(lèi)型是 User數(shù)組 呢?
因?yàn)楹蠖颂崆坝么罅看a寫(xiě)死了數(shù)據(jù)結(jié)構(gòu)和解析方式,也就是 Type 和 Schema :
//聲明 GraphQLObjectType 類(lèi)型,包括字段 fields 和解析函數(shù) resolver var UserType = new GraphQLObjectType({ name: "User", fields: () => ({ name: { type: GraphQLString }, friends: { args: { first: { type: GraphQLInt } }, type: new GraphQLList(UserType), //聲明 friends 的類(lèi)型是 User 數(shù)組 resolve: (user, { first }) => { //查 friends 的解析函數(shù) 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))); } } }) });
//聲明結(jié)構(gòu) Schema,包括 查詢結(jié)構(gòu) Query export const UserSchema = new GraphQLSchema({ query: { user: { type: UserType //聲明 me 的類(lèi)型是 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 的解析函數(shù) return ctx.db.findOne( "SELECT * FROM User WHERE id = " + id ).then(row => getUserFromRow(row)); } } } });
以上代碼是根據(jù)官方代碼
https://github.com/graphql/gr...__tests__/starWarsSchema.js
https://github.com/facebook/d...
和 http://apijson.org 提供測(cè)試的數(shù)據(jù)庫(kù)表 來(lái)實(shí)現(xiàn)的。
GraphQL 用 JavaScript 就這么復(fù)雜繁瑣了,用 Java,C# 等靜態(tài)類(lèi)型語(yǔ)言會(huì)麻煩幾倍!
APIJSON 是這樣查的:
{ "User": { "id": 82001, //查詢條件:id = 82001 "User[]": { //數(shù)組,提取里面每一項(xiàng)的 User "count": 5, //前 5 條:LIMIT 0, 5 "User": { "id{}@": "User/contactIdList", //在朋友id列表里:id IN contactIdList "@column": "name" //只查字段 name: SELECT name } } } }
或者把 User 數(shù)組放到外面減少嵌套層級(jí)(不知道GraphQL怎么實(shí)現(xiàn),知道的留個(gè)評(píng)論謝謝)
{ "User": { "id": 82001 }, "User[]": { "count": 5, "User": { "id{}@": "User/contactIdList", "@column": "name" } } }
User 數(shù)組里每個(gè)對(duì)象里都只有 name 這一個(gè)字段,如果想去掉多余的一層包裝,
APIJSON 可以【提取字段】(GraphQL 未提供)
{ "User": { "id": 82001 }, "User-name[]": { //從數(shù)組里面每個(gè) User 里取出 name "count": 5, "User": { "id{}@": "User/contactIdList", "@column": "name" } } }
以上信息已經(jīng)充分描述了 表、字段、查詢條件、表關(guān)聯(lián)方式 等信息。
APIJSON 后端不用寫(xiě)任何代碼,
它會(huì)【完全自動(dòng)】地 將以上請(qǐng)求 JSON 自動(dòng)解析成 SQL 語(yǔ)句
SELECT * FROM User WHERE id = 82001
SELECT name FROM User WHERE id IN ${contactIdList} -- contactIdList 從上面的 User 取出
然后【自動(dòng)執(zhí)行】并返回對(duì)應(yīng)結(jié)構(gòu)的 JSON 結(jié)果!
點(diǎn)左邊 [ "/" ] 按鈕可以將數(shù)組符號(hào) [] 轉(zhuǎn)為單詞 List 哦(用 JSONResponse.format 格式化)
注: 以上APIJSON請(qǐng)求都可以在 http://apijson.org 在線工具上測(cè)試
后期預(yù)告:
完爆F(xiàn)acebook/GraphQL,APIJSON全方位對(duì)比解析
——? 數(shù)據(jù)結(jié)構(gòu)靈活性、接口安全性、接口工具、社區(qū)生態(tài)、靜態(tài)類(lèi)型/強(qiáng)類(lèi)型 語(yǔ)言 …
總結(jié)
用 GraphQL 實(shí)現(xiàn)表關(guān)聯(lián)查詢是復(fù)雜繁瑣的,后端要寫(xiě)大量代碼,容易出錯(cuò)、擴(kuò)展麻煩!
而用 APIJSON 則非常簡(jiǎn)單方便,后端不用寫(xiě)任何代碼,完全自動(dòng)解析,沒(méi)有維護(hù)成本!
APIJSON,讓后端接口和文檔自動(dòng)化,前端(客戶端) 定制返回JSON的數(shù)據(jù)和結(jié)構(gòu)!
創(chuàng)作不易,右上角點(diǎn)Star支持下吧,非常感謝^_^
https://github.com/TommyLemon/APIJSON?(Java Server, Anroid, iOS, JavaScript)
https://github.com/liaozb/APIJSON.NET?(C# .NET Core Server)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96204.html