apijson 初探

2022-10-31 21:01:01

apijson 初探

本文試著用 5W1H 方式切入,試圖快速建立自己對 apijson 的整體認知,所以這不是一趟快速入門的 demo 之旅,而是顯得比較務虛的探索式知識體系整合過程。

持續更新中...

1、Why

前後端開發過程中各種痛點:

  1. 開發流程繁瑣、週期長
  2. 前端/使用者端與後端各種扯皮
  3. 檔案過時-與介面不同步
  4. 後端拼裝資料費時費力且重複性勞動價值很低,全部交給前端拼裝又浪費流量頻寬
  5. 等等

誰應該負責徹底解決這個問題?

後端。

怎麼解決?

後端實現一種萬能查詢,並能減少絕大部分重複的常規資料CRUD功能及資料拼裝等開發過程,定義一套統一的規範讓前端來學習掌握,以後後端除了維護好這個 DSL 的執行時,就只需要做好資料實體的定義及許可權維護可以了。

這裡的前端,不一定只是 Web 前端開發,而是包含了更廣義的 Client 端開發的大前端開發人員,比如安卓使用者端開發人員、甚至包含部分在平臺上做小應用的後端開發人員。

前端是時候 Get 一門新技能了。

2、What

官方:

APIJSON 是一種專為 API 而生的 JSON 網路傳輸協定 以及 基於這套協定實現的 ORM 庫。

據個人理解,它定義了一整套 DSL 作為 API Client 的查詢語言(Query Language)的規範(Specification),同時也是的一款對應的後端具體實現(Implementation for the Spec at server side)。

是的,這會讓人想起 GraphQL,如果做一些對比工作的話,會發現他們在 Spec 還是有重疊的部分的。 當然,一般國產的都是精品,APIJSON 也不會例外,APIJSON 在功能、安全、效能、易用性、Java 版生態(繼承 JSON 的相關生態) 等方面都會比 GraphQL 更實用易用。

因此,可以考慮為這種 QL 取個名字,比如 ApijsonQL、或者短一點 apiQL。我選 apiQL。

特性設計:

後端

  1. 提供萬能通用介面,大部分介面不用再寫(後端統一基於apiQL語言提供服務)
  2. 零碼CRUD(增刪改查)、跨庫連表、巢狀子查詢等(後端將DAO層開放給前端)
  3. 自動生成介面檔案,不用再編寫和維護(藉助於生態工具)
  4. 自動管理許可權、校驗引數、防 SQL 注入(達到基本的安全要求)
  5. 開放 API,無需劃分版本,始終保持相容(後端根本就沒有具體的API)

前端

  1. 前端不用再向後端開發同事催介面、求檔案(前端基於apiQL語言直接進行DAO)
  2. 前端能完全客製化資料和結構,要啥有啥(前端自行按需拼裝)
  3. 前端呼叫介面看請求知結果,所求即所得(前端基於apiQL語言直接進行DAO)
  4. 前端可以一次性獲取任何資料、任何結構(前端自行按需拼裝)
  5. 前端能夠去除多餘資料,節省流量提高速度(前端自行按需拼裝)

介面工具

  1. 自動實時生成檔案,清晰可讀永遠最新
  2. 自動校驗與格式化,支援高亮和收展
  3. 自動生成各端各種語言程式碼,一鍵下載
  4. 自動管理與測試各介面用例,一鍵共用
  5. 自動給 JSON 加註釋和檔案,一鍵切換

DSL Specification

Client 應用使用 apiQL 查詢語言來請求支援 apiQL 的服務。

apiQL 是基於 JSON 資料格式定義的一種 DSL,對於 Cleint 開發人員來說,語法學習成本極低。剩下的,主要是熟悉領域特定的部分。

範例報文

請求:

{
   "[]":{
     "page":0,
     "count":3,
     "Moment":{},
     "User":{
       "id@":"/Moment/userId"
     },
     "Comment[]":{
       "count":3,
       "Comment":{
         "momentId@":"[]/Moment/id"
       }
     }
   }
}

響應:

{
   "[]":[
     {
       "Moment":{
         "id":235,
         "content":"xxx",
         ...
       },
       "User":{
         ...
       },
       "Comment[]":[
         ...
       ]
     },
     {
       "Moment":{
         "id":301,
         "content":"xxx",
         ...
       },
       "User":{
         ...
       },
       ...
     },
     ...
   ],
   "code":200,
   "msg":"success"
}

DAO/實體服務

apijson 如官方所述作為一款 ORM,其實質是將原來傳統開發模式中的三層架構中的資料持久化層直接開放給前端,即壓縮了領域層和表現層(很薄,僅做可選的許可權校驗,但是可以通過重寫方法來自定義許可權),幾乎是讓前端的視線直接穿透到資料持久化層來進行他們的對接開發工作。

前端開發需要建立一種新習慣 - 主動進行資料查詢和拼接,而非像以前那般,等待後端拼接好再給出來。當然,也可以延續傳統的開發習慣,由後端人員整理介面格式和生成檔案,再有前端去呼叫,可以無縫銜接;不同的是,後端開發人員並沒有「開發」的過程,只有寫檔案的過程。

具體如何實踐,可以按團隊實際情況來做選擇。

apiQL 中目前支援的 Query 語句

  1. 查詢陣列
  2. 匹配選項範圍
  3. 匹配條件範圍
  4. 包含選項範圍
  5. 判斷是否存在
  6. 遠端呼叫函數
  7. 儲存過程
  8. 參照賦值
  9. 子查詢
  10. 模糊搜尋
  11. 正則匹配
  12. 連續範圍
  13. 新建別名
  14. 增加 或 擴充套件
  15. 減少 或 去除
  16. 比較運算
  17. 邏輯運算
  18. 陣列關鍵詞
  19. 物件關鍵詞
  20. 全域性關鍵詞

DAO 方法

借鑑 Restful Api 中的 verbs 術語,實際請求時全用HTTP POST請求。

  1. GET: 普通獲取資料
  2. HEAD: 普通獲取數量
  3. GETS: 安全/私密獲取資料,用於獲取錢包等對安全性要求高的資料
  4. HEADS: 安全/私密獲取數量,用於獲取銀行卡數量等對安全性要求高的資料總數
  5. POST: 新增資料
  6. PUT: 修改資料,只修改所傳的欄位
  7. DELETE: 刪除資料

實際使用時,最好在前端封裝一套對應的 QueryBuilder,得到更 OO-Style 的體驗,而不是記憶一堆「方言」詞彙, 如 apijson-builder

3、Who/When/Where

適用場景

非金融類場景;中小型前後端分離的專案,尤其是 初創專案、內部專案、低程式碼/零程式碼、小程式、BaaS、Serverless 等。

簡易Demo

APIJSON-ToDo-Demo 一個簡單的 todo 範例專案,精簡資料,簡化上手流程,帶自定義鑑權邏輯

管理類系統

apijson-examples APIJSON 的前端、業務後端、管理後端 Demo

4、How

按需依賴

  1. apijson-orm APIJSON ORM 庫,可通過 Maven, Gradle 等遠端依賴
  2. apijson-framework APIJSON 伺服器端框架,通過資料庫表設定角色許可權、引數校驗等,簡化使用
  3. apijson-router APIJSON 的路由外掛,可控地對公網暴露類 RESTful 簡單介面,內部轉成 APIJSON 格式請求來執行。
  4. apijson-column APIJSON 的欄位外掛,支援 欄位名對映 和 !key 反選欄位

Quick Start

TODO

Best Practices

檔案

  1. APIJSON 官方檔案 ,提供排版清晰、搜尋方便的檔案內容展示,包括設計規範、圖文教學等
  2. APIJSON 英文檔案 ,提供排版清晰的檔案內容展示,包括詳細介紹、設計規範、使用方式等

視訊教學

APIJSON 後端教學(1):簡介
https://www.bilibili.com/video/BV1vL411W7yd

APIJSON 後端教學(2):資料庫
https://www.bilibili.com/video/BV1eB4y1N77s

APIJSON 後端教學(3):Demo
https://www.bilibili.com/video/BV1FX4y1c7ug

APIJSON 後端教學(4):Boot
https://www.bilibili.com/video/BV18h411z7FK

APIJSON 後端教學(5):Final
https://www.bilibili.com/video/BV1GM4y1N7XJ

APIJSON 後端教學(6):uliweb_apijson
https://www.bilibili.com/video/BV1yb4y1S79v/

APIJSON 後端教學(7):問題答疑
https://www.bilibili.com/video/BV1dQ4y1h7Df

FAQ

https://hanxu2018.github.io/APIJSON-DOC/md/QA/#q-a-常見問題

5、Other

生態

  1. APIAuto 敏捷開發最強大易用的 HTTP 介面工具,機器學習零程式碼測試、生成程式碼與靜態檢查、生成檔案與遊標懸浮註釋
  2. UnitAuto 機器學習單元測試平臺,零程式碼、全方位、自動化 測試 方法/函數 的正確性和可用性
  3. SQLAuto 智慧零程式碼自動化測試 SQL 語句執行結果的資料庫工具