apijson 初探
apijson 初探
本文试着用 5W1H 方式切入,试图快速建立自己对 apijson 的整体认知,所以这不是一趟快速入门的 demo 之旅,而是显得比较务虚的探索式知识体系整合过程。
持续更新中...
1、Why
前后端开发过程中各种痛点:
- 开发流程繁琐、周期长
- 前端/客户端与后端各种扯皮
- 文档过时-与接口不同步
- 后端拼装数据费时费力且重复性劳动价值很低,全部交给前端拼装又浪费流量带宽
- 等等
谁应该负责彻底解决这个问题?
后端。
怎么解决?
后端实现一种万能查询,并能减少绝大部分重复的常规数据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。
特性设计:
后端
- 提供万能通用接口,大部分接口不用再写(后端统一基于apiQL语言提供服务)
- 零码CRUD(增删改查)、跨库连表、嵌套子查询等(后端将DAO层开放给前端)
- 自动生成接口文档,不用再编写和维护(借助于生态工具)
- 自动管理权限、校验参数、防 SQL 注入(达到基本的安全要求)
- 开放 API,无需划分版本,始终保持兼容(后端根本就没有具体的API)
前端
- 前端不用再向后端开发同事催接口、求文档(前端基于apiQL语言直接进行DAO)
- 前端能完全定制数据和结构,要啥有啥(前端自行按需拼装)
- 前端调用接口看请求知结果,所求即所得(前端基于apiQL语言直接进行DAO)
- 前端可以一次性获取任何数据、任何结构(前端自行按需拼装)
- 前端能够去除多余数据,节省流量提高速度(前端自行按需拼装)
接口工具
- 自动实时生成文档,清晰可读永远最新
- 自动校验与格式化,支持高亮和收展
- 自动生成各端各种语言代码,一键下载
- 自动管理与测试各接口用例,一键共享
- 自动给 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 语句
- 查询数组
- 匹配选项范围
- 匹配条件范围
- 包含选项范围
- 判断是否存在
- 远程调用函数
- 存储过程
- 引用赋值
- 子查询
- 模糊搜索
- 正则匹配
- 连续范围
- 新建别名
- 增加 或 扩展
- 减少 或 去除
- 比较运算
- 逻辑运算
- 数组关键词
- 对象关键词
- 全局关键词
DAO 方法
借鉴 Restful Api 中的 verbs 术语,实际请求时全用HTTP POST请求。
- GET: 普通获取数据
- HEAD: 普通获取数量
- GETS: 安全/私密获取数据,用于获取钱包等对安全性要求高的数据
- HEADS: 安全/私密获取数量,用于获取银行卡数量等对安全性要求高的数据总数
- POST: 新增数据
- PUT: 修改数据,只修改所传的字段
- DELETE: 删除数据
实际使用时,最好在前端封装一套对应的 QueryBuilder,得到更 OO-Style 的体验,而不是记忆一堆“方言”词汇, 如 apijson-builder。
3、Who/When/Where
适用场景
非金融类场景;中小型前后端分离的项目,尤其是 初创项目、内部项目、低代码/零代码、小程序、BaaS、Serverless 等。
简易Demo
APIJSON-ToDo-Demo 一个简单的 todo 示例项目,精简数据,简化上手流程,带自定义鉴权逻辑
管理类系统
apijson-examples APIJSON 的前端、业务后端、管理后端 Demo
4、How
按需依赖
- apijson-orm APIJSON ORM 库,可通过 Maven, Gradle 等远程依赖
- apijson-framework APIJSON 服务端框架,通过数据库表配置角色权限、参数校验等,简化使用
- apijson-router APIJSON 的路由插件,可控地对公网暴露类 RESTful 简单接口,内部转成 APIJSON 格式请求来执行。
- apijson-column APIJSON 的字段插件,支持 字段名映射 和 !key 反选字段
Quick Start
TODO
Best Practices
文档
- APIJSON 官方文档 ,提供排版清晰、搜索方便的文档内容展示,包括设计规范、图文教程等
- 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
生态
- APIAuto 敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释
- UnitAuto 机器学习单元测试平台,零代码、全方位、自动化 测试 方法/函数 的正确性和可用性
- SQLAuto 智能零代码自动化测试 SQL 语句执行结果的数据库工具
apijson 初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- Excel 统计函数(四):AVERAGEIF 和 AVERAGEIFS
AVERAGEIF [语法]AVERAGEIF(range, criteria, [average_range]) [参数] range:要计算平均值的一个或多个单元格: criteria:筛选条件: ...
- [HNOI2016]最小公倍数 (可回退并查集,回滚莫队)
题面 题目链接 题目描述 给定一张 N N N 个顶点 M M M 条边的无向图(顶点编号为 1 , 2 , - , n 1,2,\ldots,n 1,2,-,n),每条边上带有权值.所有权值都可以分 ...
- PI控制器的由来
20世纪20年代初,一位名叫尼古拉斯·米诺斯基(Nicolas Minorsky)的俄裔美国工程师通过观察舵手在不同条件下如何驾驶船只,为美国海军设计了自动转向系统. 根据Wikipedia.org, ...
- IDEA整合Docker
创建项目 1.使用 IDEA 构建一个 SpringBoot 项目 2.编写一个helloController @RestController public class HelloController ...
- SpringMVC前置复习以及扩展
SpringMVC ssm:mybatis+Spring+SpringMVC javaSE javaweb 框架 理解的DAO层和Service层 先简单来讲下Dao层,和Service层的概念: S ...
- KingbaseES 数据库静默安装
关键字:KingbaseES.V8R6.Silent.Java 一.环境准备 1.硬件环境支持 金仓数据库管理系统KingbaseES支持X86.X86_64,同时支持龙芯.飞腾等国产CPU硬件体系结 ...
- Mac隔空投送功能
使用mac 或iphone 的隔空投送功能可以互发文件,亲测可用 具体可以看mac的文档 需要注意的是: 如果是mac传iphone,iphone会显示你需要存储文件的地方,比如选择在文稿中.然后在文 ...
- [AI]-模型测试和评价指标
模型测试 import cv2 from torchvision import transforms, datasets, models from torch.utils.data import Da ...
- .NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试
.NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试 开发环境 VS2022 .NET 6 测试环境 测试工具 接口压力测试工具:JMeter 数据库 MySQL 5.7 数据 ...
- 使用nginx-ingress-controller配置https,但是再同时配置使用http
默认情况下,如果为该 Ingress 启用了 TLS,控制器会使用 308 永久重定向响应将 HTTP 客户端重定向到 HTTPS 端口 443.( Ingress 里配置了 https 证书的话,默 ...