APIJSON
APIJSON 是一个功能强大的 JSON 传输协议和 ORM 库,它允许前端(客户端)定制返回 JSON 的数据和结构,而后端无需编写任何代码即可提供 API 接口和文档。该项目由腾讯开源,已成为腾讯内部使用广泛的开源项目之一。
功能特性
对于前端
- 灵活定制返回内容:可以指定需要返回的字段、表关联、过滤条件等,无需后端为每个需求单独开发接口
- 减少请求次数:单次请求可以获取多个相关对象或数组,减少网络请求次数
- 结构清晰易用:使用 JSON 格式,结构清晰,易于理解和调试
对于后端
- 零代码开发:无需为每个表编写增删改查接口,只需配置数据库表和权限即可
- 自动生成文档:接口文档自动生成,无需手动维护
- 支持多种数据库:支持 MySQL、PostgreSQL、SQL Server、Oracle、DB2、TiDB、MariaDB 等多种数据库
- 强大的查询能力:支持简单查询、统计、分组、排序、聚合、比较、筛选字段、字段别名等功能
- 安全可靠:提供完整的权限控制和参数校验机制
安装指南
Maven 依赖
在pom.xml中添加 JitPack 仓库和 APIJSON 依赖:
<repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories><dependency><groupId>com.github.Tencent</groupId><artifactId>APIJSON</artifactId><version>LATEST</version></dependency>Gradle 依赖
在项目根目录build.gradle中添加:
allprojects { repositories { maven { url 'https://jitpack.io' } } }在模块build.gradle中添加:
dependencies { implementation 'com.github.Tencent:APIJSON:latest' }环境要求
- JDK 1.8+
- MySQL 5.7+ / PostgreSQL 9.5+ / Oracle 12C+ 或其他支持的数据库
- Maven 3.0+ 或 Gradle
使用说明
基础查询示例
获取单个用户
请求:
{"User":{"id":38710}}响应:
{"User":{"id":38710,"sex":0,"name":"TommyLemon","tag":"Android&Java","head":"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000","date":1485948110000,"pictureList":["http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000","http://common.cnblogs.com/images/icon_weibo_24.png"]},"code":200,"msg":"success"}获取用户列表
请求:
{"[]":{"count":3,"User":{"@column":"id,name"}}}响应:
{"[]":[{"User":{"id":38710,"name":"TommyLemon"}},{"User":{"id":70793,"name":"Strong"}},{"User":{"id":82001,"name":"Android"}}],"code":200,"msg":"success"}复杂查询示例
支持关联查询、分组、排序、聚合函数等复杂操作:
{"Moment":{"@column":"id,userId,content","id{}":">0","@order":"id-"},"User":{"@column":"id,name","id@":"/Moment/userId"}}事务操作
一个 JSON 请求可以同时支持新增、修改、删除、查询等多种操作:
{"@post":"Moment,Comment:cArray[],User:u","Moment":{"content":"测试内容"},"Comment:cArray[]":[{"content":"评论1"}],"@get":"User","User:u":{"id":82001}}核心代码
JSON 工具类
/*Copyright (C) 2020 Tencent. All rights reserved.*/packageapijson;importjava.util.Collection;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Map;/** * JSON工具类 防止解析时异常 * @author Lemon */publicclassJSON{staticfinalStringTAG="JSON";publicstaticJSONParser<?extendsMap<String,Object>,?extendsList<Object>>DEFAULT_JSON_PARSER;// 创建JSON对象publicstatic<MextendsMap<String,Object>>McreateJSONObject(){returnDEFAULT_JSON_PARSER.createJSONObject();}// 解析JSON字符串publicstaticMap<String,Object>parseObject(Objectjson){returnDEFAULT_JSON_PARSER.parseObject(json);}// 将对象转换为JSON字符串publicstaticStringtoJSONString(Objectobj){returnDEFAULT_JSON_PARSER.toJSONString(obj);}}JSON 请求接口
/*Copyright (C) 2020 Tencent. All rights reserved.*/packageapijson;importjava.util.List;importjava.util.Map;/** * 请求JSON包装器 * @author Lemon */publicinterfaceJSONRequest<MextendsMap<String,Object>,LextendsList<Object>>extendsJSONMap<M,L>{publicstaticfinalStringKEY_TAG="tag";// 只在最外层publicstaticfinalStringKEY_VERSION="version";// 只在最外层publicstaticfinalStringKEY_FORMAT="format";// 只在最外层// 设置标签defaultJSONRequest<M,L>setTag(Stringtag){returnputs(KEY_TAG,tag);}// 设置版本defaultJSONRequest<M,L>setVersion(Integerversion){returnputs(KEY_VERSION,version);}// 设置格式defaultJSONRequest<M,L>setFormat(Booleanformat){returnputs(KEY_FORMAT,format);}}SQL 配置类
/*Copyright (C) 2020 Tencent. All rights reserved.*/packageapijson.orm;importapijson.RequestMethod;importjava.util.List;importjava.util.Map;/** * SQL配置接口 * @author Lemon */publicinterfaceSQLConfig<T,MextendsMap<String,Object>,LextendsList<Object>>{// 支持的数据库类型StringDATABASE_MYSQL="MYSQL";StringDATABASE_POSTGRESQL="POSTGRESQL";StringDATABASE_SQLSERVER="SQLSERVER";StringDATABASE_ORACLE="ORACLE";StringDATABASE_DB2="DB2";// 获取表名StringgetTable();// 获取别名StringgetAlias();// 获取数据库类型StringgetDatabase();// 获取schemaStringgetSchema();// 获取请求方法RequestMethodgetMethod();// 设置请求方法SQLConfig<T,M,L>setMethod(RequestMethodmethod);}解析器接口
/*Copyright (C) 2020 Tencent. All rights reserved.*/packageapijson.orm;importapijson.RequestMethod;importjava.util.List;importjava.util.Map;/** * 解析器接口 * @author Lemon */publicinterfaceParser<T,MextendsMap<String,Object>,LextendsList<Object>>{// 获取访问者Visitor<T>getVisitor();// 设置访问者Parser<T,M,L>setVisitor(Visitor<T>visitor);// 获取请求方法RequestMethodgetMethod();// 设置请求方法Parser<T,M,L>setMethod(RequestMethodmethod);// 解析请求MparseResponse(Mrequest);// 执行SQLMexecuteSQL(SQLConfig<T,M,L>config,booleanisSubquery)throwsException;}远程函数解析器
/*Copyright (C) 2020 Tencent. All rights reserved.*/packageapijson.orm;importjava.util.List;importjava.util.Map;importapijson.JSONMap;/** * 远程函数解析器 * @author Lemon */publicinterfaceFunctionParser<T,MextendsMap<String,Object>,LextendsList<Object>>{// 调用函数Objectinvoke(Stringfunction,McurrentObject)throwsException;// 获取解析器Parser<T,M,L>getParser();// 设置解析器FunctionParser<T,M,L>setParser(Parser<T,M,L>parser);// 获取请求方法RequestMethodgetMethod();// 设置请求方法FunctionParser<T,M,L>setMethod(RequestMethodmethod);// 获取当前对象MgetCurrentObject();// 设置当前对象FunctionParser<T,M,L>setCurrentObject(McurrentObject);}这些核心代码展示了 APIJSON 的核心架构,包括 JSON 解析、SQL 配置、请求处理和远程函数调用等功能模块。通过这些组件,APIJSON 能够实现无需编写代码即可提供完整 API 接口的功能。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)