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 语句执行结果的数据库工具

apijson 初探的更多相关文章

  1. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  2. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  3. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  4. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  5. .NET文件并发与RabbitMQ(初探RabbitMQ)

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...

  6. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  7. 【手把手教你全文检索】Apache Lucene初探

    PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...

  8. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  9. NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

随机推荐

  1. TDM 三部曲 (与 Deep Retrieval)

    推荐系统的主要目的是从海量物品库中高效检索用户最感兴趣的物品,既然是"海量",意味着用户基本不可能浏览完所有的物品,所以才需要推荐系统来辅助用户高效获取感兴趣的信息.同样也正是因为 ...

  2. Java SE 14 新增特性

    Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  3. 从new File("")到jdk源码

    1. 概述 今天在项目中看到下面两行代码,看注释说是获取当前工作路径,之前也没有用过这种用法,比较好奇还能这样用,所以研究了一下源码. //获取当前工作路径 File file = new File( ...

  4. Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  5. Linux之如何配置IPV6网络

    配置IPV6地址小笔记 #例题: 1)为server添加一个IPv6地址fd00:ba5e:ba11:10::10/64: 2)为client添加一个IPv6地址fd00:ba5e:ba11:10:: ...

  6. KingbaseES 数据脱敏功能介绍

    数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护. KingbaseES主要提供动态数据脱敏功能. 动态数据脱敏(Dynamic Data Masking)是与生产环境 ...

  7. Docker_删除所有容器

    删除所有容器 docker rm `docker ps -aq`

  8. 【读书笔记】C#高级编程 第十九章 程序集

    (一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...

  9. 国内外各大物联网IoT平台鸟瞰和资源导航

    一.国内外物联网平台 国内 百度物接入IoT Hub 阿里云物联网套件 智能硬件开放平台 京东微联 机智云IoT物联网云服务平台及智能硬件自助开发平台 庆科云FogCloud Ablecloud物联网 ...

  10. Java注解系统学习与实战

    背景 为什么要再次梳理一下java注解,显而易见,因为重要啊.也是为研究各大类开源框架做铺垫,只有弄清楚Java注解相关原理,才能看懂大部分框架底层的设计. 缘起 注解也叫做元数据,是JDK1.5版本 ...