共计 7213 个字符,预计需要花费 19 分钟才能阅读完成。
简述
APIJSON 是一个关于 API 和 JSON 的综合技术或框架,一种专为 API 设计的 JSON 网络传输协议,以及基于这套协议实现的 ORM 库。
1. 定义与特点:
- APIJSON 是一种基于接口的 JSON 传输结构协议,它允许客户端定义任何 JSON 结构来向服务端发起请求,服务端则返回对应结构的 JSON 字符串,实现“所求即所得”的效果。
- 它为简单的增删改查提供了完全自动化的万能 API,能够零代码实时满足各种新增和变更需求。
- 通过 APIJSON,可以大幅降低开发和沟通成本,简化开发流程,缩短开发周期。
2. 主要作用:
- APIJSON 的主要作用在于简化客户端和服务端之间的数据交换过程,使得前后端开发者能够更加高效地协同工作。
- 它支持多种编程语言和平台,包括 JavaScript、Python、Java、C# 等,因此具有广泛的应用价值。
3. 使用场景:
- APIJSON 特别适用于中小公司、团队及个人开发者,解决他们在客户端和服务端之间数据交换的问题。
- 它被广泛应用于 Web 开发、移动应用开发、桌面应用开发等领域。
4. 基本用法:
- 定义 API 接口:使用类似 JSON 的格式来定义 API 接口,包括 URL、请求方法、参数、返回结果等信息。
- 发送请求:使用 HTTP 客户端工具(如 Postman)或编程语言中的 HTTP 请求库来发送请求。
- 解析返回结果:APIJSON 服务端会返回符合定义的 JSON 格式的数据作为响应,开发者可以解析和处理返回的数据。
5. 优势:
- 结构清晰:APIJSON 的层次结构简洁清晰,易于人阅读和编写,同时也易于机器解析和生成。
- 高效性:相比 XML,JSON 更小、更快,更易解析,因此其被广泛应用于网络数据传输领域。
- 通用性:支持多种编程语言和平台,使得 APIJSON 成为一种通用的数据交换格式。
APIJSON CRUD
1. 创建(Create)
- ** 功能:** 通过 APIJSON,你可以轻松地向数据库中添加新的记录。
- 实现:
- 定义 API 接口,指定请求方法(如 POST)、URL 和请求体(JSON 格式)。
- 在请求体中,包含要创建的数据的字段和值。
- 发送请求,APIJSON 后端服务将解析请求体,并将数据插入到数据库中。
- ** 示例:** 假设有一个名为 users 的表,并希望添加一个新用户。可以发送一个 POST 请求到 /api/users,请求体如下:
{
"user": {
"id": 0,
"name": "John Doe",
"age": 30,
"email": "johndoe@example.com"
}
}
2. 读取(Read)
- ** 功能:** 通过 APIJSON,你可以从数据库中检索数据。
- 实现:
- 定义 API 接口,指定请求方法(如 GET)、URL 和查询参数(可选)。
- 发送请求,APIJSON 后端服务将根据查询参数从数据库中检索数据。
- ** 示例:** 要检索所有用户,你可以发送一个 GET 请求到 /api/users。要检索特定用户(如 ID 为 1 的用户),你可以发送 GET 请求到 /api/users/1。
GET /User/1
返回结果:
{
"code": 200,
"msg": "success",
"data": {
"User": {
"id": 1,
"name": "John Doe",
"age": 30
}
}
}
3. 更新(Update)
- ** 功能:** 通过 APIJSON,你可以修改数据库中的现有记录。
- 实现:
- 定义 API 接口,指定请求方法(如 PUT 或 PATCH)、URL 和请求体(JSON 格式)。
- 在请求体中,包含要更新的数据的字段和新的值,以及用于标识要更新的记录的 ID 或其他唯一标识符。
- 发送请求,APIJSON 后端服务将解析请求体,并更新数据库中的记录。
-** 示例:** 要更新 ID 为 1 的用户的邮箱地址,你可以发送一个 PUT 或 PATCH 请求到 /api/users/1,请求体如下:
{
"user": {
"id": 1,
"email": "newemail@example.com"
}
}
4. 删除(Delete)
- 功能: 通过 APIJSON,你可以从数据库中删除现有记录。
- 实现:
- 定义 API 接口,指定请求方法(如 DELETE)、URL 和查询参数(可选)。
- 发送请求,APIJSON 后端服务将根据 URL 或查询参数从数据库中删除记录。
- 示例: 要删除 ID 为 1 的用户,你可以发送一个 DELETE 请求到 /api/users/1。
DELETE /User/1
DEMO
流程
- ** 项目设置:** 首先,确保你的项目中已经引入了 APIJSON 的依赖。对于 Java 项目,你需要在 pom.xml 文件中添加 APIJSON 的依赖(参考文章 1)。
- ** 数据库配置:** 按照 APIJSON 的要求,配置数据库连接信息(如 URL、用户名、密码等)。在 Demo 中,这些信息通常位于配置文件中,如 DemoSQLConfig.java(参考文章 2)。
- ** 数据表:** 假设我们有一个名为 users 的数据表,包含 id、name、age 等字段。
pom.xml
dependency>
groupId>com.github.TencentgroupId>
artifactId>APIJSONartifactId>
version>6.3.0version>
dependency>
dependency>
groupId>com.github.APIJSONgroupId>
artifactId>apijson-frameworkartifactId>
version>6.3.0version>
dependency>
dependency>
groupId>mysqlgroupId>
artifactId>mysql-connector-javaartifactId>
version>8.0.29version>
dependency>
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-webartifactId>
version>2.5.13version>
dependency>
dependency>
groupId>com.alibabagroupId>
artifactId>fastjsonartifactId>
version>2.0.43version>
dependency>
application
package apijson.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import apijson.Log;
import apijson.framework.APIJSONApplication;
import apijson.framework.APIJSONCreator;
import apijson.orm.SQLConfig;
@Configuration
@SpringBootApplication
@EnableConfigurationProperties
public class DemoApplication implements WebServerFactoryCustomizerConfigurableServletWebServerFactory> {
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
Log.DEBUG = true;
APIJSONApplication.init(false);
}
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(8080);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
static {
APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreatorLong>() {
@Override
public SQLConfig createSQLConfig() {
return new DemoSQLConfig();
}
};
}
}
config
package apijson.demo;
import com.alibaba.fastjson.annotation.JSONField;
import apijson.framework.APIJSONSQLConfig;
public class DemoSQLConfig extends APIJSONSQLConfig {
static {
DEFAULT_DATABASE = DATABASE_MYSQL;
DEFAULT_SCHEMA = "apijson";
TABLE_KEY_MAP.put("User", "apijson_user");
TABLE_KEY_MAP.put("Privacy", "apijson_privacy");
}
@Override
public String getDBVersion() {
return "5.7.22";
}
@JSONField(serialize = false)
@Override
public String getDBUri() {
return "jdbc:mysql://localhost:3306?serverTimezone=GMT+8&useUnicode=true&characterEncoding=UTF-8";
}
@JSONField(serialize = false)
@Override
public String getDBAccount() {
return "root";
}
@JSONField(serialize = false)
@Override
public String getDBPassword() {
return "123456";
}
}
controller
package apijson.demo;
import java.net.URLDecoder;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import apijson.RequestMethod;
import apijson.StringUtil;
import apijson.framework.APIJSONController;
import apijson.orm.Parser;
@RestController
@RequestMapping("")
public class DemoController extends APIJSONControllerLong> {
@Override
public ParserLong> newParser(HttpSession session, RequestMethod method) {
return super.newParser(session, method).setNeedVerify(false);
}
@PostMapping(value = "{method}")
@Override
public String crud(@PathVariable String method, @RequestBody String request, HttpSession session) {
return super.crud(method, request, session);
}
@PostMapping(value = "crud")
public String crudAll(@RequestBody String request, HttpSession session) {
return newParser(session, RequestMethod.CRUD).parse(request);
}
@PostMapping("{method}/{tag}")
@Override
public String crudByTag(@PathVariable String method, @PathVariable String tag, @RequestParam MapString, String> params, @RequestBody String request, HttpSession session) {
return super.crudByTag(method, tag, params, request, session);
}
}
初始化脚本
[初始化脚本](https://gitee.com/APIJSON/APIJSON-Demo/blob/master/MySQL/sys.sql)
请求样例
- 请求
curl --location --request POST 'http://localhost:8080/get'
--header 'Content-Type: application/json'
--data-raw '{"User[]":{"count":3,"User":[]
}
}'
- 返回
{
"User[]": [
[],
{
"$ref": "$.User[][0]"
},
{
"$ref": "$.User[][0]"
}
],
"ok": true,
"code": 200,
"msg": "success",
"debug:info|help": "n 提 bug 请发请求和响应的【完整截屏】,没图的自行解决!n 开发者有限的时间和精力主要放在【维护项目源码和文档】上!n【描述不详细】或【文档 / 常见问题 已有答案】的问题可能会被忽略!!n【态度 不文明 / 不友善】的可能会被踢出群,问题也可能不予解答!!!nn ** 环境信息 ** n 系统: Windows 10 10.0 n 数据库: DEFAULT_DATABASE = MYSQL nJDK: 1.8.0_101 amd64 nAPIJSON: 6.3.0 n n【常见问题】:https://github.com/Tencent/APIJSON/issues/36 n【通用文档】:https://github.com/Tencent/APIJSON/blob/master/Document.md n【视频教程】:https://search.bilibili.com/all?keyword=APIJSON",
"time": 1717495293436,
"sql:generate|cache|execute|maxExecute": "0|0|0|200",
"depth:count|max": "2|5",
"time:start|duration|end|parse|sql": "1717495293434|2|1717495293436|2|0"
}
原文地址: 【开源】APIJSON 框架
正文完