【开源】APIJSON 框架

简述

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,你可以轻松地向数据库中添加新的记录。
  • 实现:
    1. 定义API接口,指定请求方法(如POST)、URL和请求体(JSON格式)。
    2. 在请求体中,包含要创建的数据的字段和值。
    3. 发送请求,APIJSON后端服务将解析请求体,并将数据插入到数据库中。
  • **示例:**假设有一个名为users的表,并希望添加一个新用户。可以发送一个POST请求到/api/users,请求体如下:
{  "user": {  "id": 0,  // 通常为自增主键,可省略或设为0  "name": "John Doe",  "age": 30,  "email": "johndoe@example.com"  }  
}

2. 读取(Read)

  • **功能:**通过APIJSON,你可以从数据库中检索数据。
  • 实现:
    1. 定义API接口,指定请求方法(如GET)、URL和查询参数(可选)。
    2. 发送请求,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,你可以修改数据库中的现有记录。
  • 实现:
    1. 定义API接口,指定请求方法(如PUT或PATCH)、URL和请求体(JSON格式)。
    2. 在请求体中,包含要更新的数据的字段和新的值,以及用于标识要更新的记录的ID或其他唯一标识符。
    3. 发送请求,APIJSON后端服务将解析请求体,并更新数据库中的记录。
      -**示例:**要更新ID为1的用户的邮箱地址,你可以发送一个PUT或PATCH请求到/api/users/1,请求体如下:
{  "user": {  "id": 1,  "email": "newemail@example.com"  }  
}

4. 删除(Delete)

  • 功能: 通过APIJSON,你可以从数据库中删除现有记录。
  • 实现:
    1. 定义API接口,指定请求方法(如DELETE)、URL和查询参数(可选)。
    2. 发送请求,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

	<!-- 需要的 APIJSON 相关依赖 --><dependency><groupId>com.github.Tencent</groupId><artifactId>APIJSON</artifactId><version>6.3.0</version></dependency><dependency><groupId>com.github.APIJSON</groupId><artifactId>apijson-framework</artifactId><version>6.3.0</version></dependency><!-- 需要用的数据库 JDBC 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency><!-- 需要用的 SpringBoot 框架,1.4.0 以上 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.13</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.43</version></dependency>

application

/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON)Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/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;
/*** Demo SpringBoot Application 主应用程序启动类*/
@Configuration
@SpringBootApplication
@EnableConfigurationProperties
public class DemoApplication implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {public static void main(String[] args) throws Exception {SpringApplication.run(DemoApplication.class, args);Log.DEBUG = true;APIJSONApplication.init(false);  }// SpringBoot 2.x 自定义端口方式@Overridepublic void customize(ConfigurableServletWebServerFactory server) {server.setPort(8080);}// 支持 APIAuto 中 JavaScript 代码跨域请求@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("*").allowCredentials(true).maxAge(3600);}};}static {// 使用本项目的自定义处理类APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator<Long>() {@Overridepublic SQLConfig createSQLConfig() {return new DemoSQLConfig();}};}
}

config

/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON)Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/package apijson.demo;import com.alibaba.fastjson.annotation.JSONField;import apijson.framework.APIJSONSQLConfig;/**SQL 配置 */
public class DemoSQLConfig extends APIJSONSQLConfig {static {DEFAULT_DATABASE = DATABASE_MYSQL;  // TODO 默认数据库类型,改成你自己的DEFAULT_SCHEMA = "apijson";  // TODO 默认数据库名/模式,改成你自己的,默认情况是 MySQL: sys, PostgreSQL: public, SQL Server: dbo, Oracle://表名映射,隐藏真实表名,对安全要求很高的表可以这么做TABLE_KEY_MAP.put("User", "apijson_user");TABLE_KEY_MAP.put("Privacy", "apijson_privacy");}@Overridepublic String getDBVersion() {return "5.7.22";  // "8.0.11";  // TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号  // MYSQL 8 和 7 使用的 JDBC 配置不一样}@JSONField(serialize = false)  // 不在日志打印 账号/密码 等敏感信息@Overridepublic String getDBUri() {return "jdbc:mysql://localhost:3306?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8"; // TODO 改成你自己的,TiDB 可以当成 MySQL 使用,默认端口为 4000}@JSONField(serialize = false)  // 不在日志打印 账号/密码 等敏感信息@Overridepublic String getDBAccount() {return "root";  // TODO 改成你自己的}@JSONField(serialize = false)  // 不在日志打印 账号/密码 等敏感信息@Overridepublic String getDBPassword() {return "123456";  // TODO 改成你自己的,TiDB 可以当成 MySQL 使用, 默认密码为空字符串 ""}
}

controller

/*Copyright ©2016 TommyLemon(https://github.com/TommyLemon/APIJSON)Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/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;
/**请求路由入口控制器,包括通用增删改查接口等,转交给 APIJSON 的 Parser 来处理*/
@RestController
@RequestMapping("")
public class DemoController extends APIJSONController<Long> {@Overridepublic Parser<Long> newParser(HttpSession session, RequestMethod method) {return super.newParser(session, method).setNeedVerify(false);  // TODO 这里关闭校验,方便新手快速测试,实际线上项目建议开启}/**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率*/@PostMapping(value = "{method}")  // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method} 或 Controller 注解 @RequestMapping("crud")@Overridepublic String crud(@PathVariable String method, @RequestBody String request, HttpSession session) {return super.crud(method, request, session);}/**全能增删改查接口,可同时进行 增、删、改、查 多种操作,* 通过 @method: "POST", @gets: { "Privacy":"Privacy-CIRCLE", "User": { "@role":"LOGIN", "tag":"User" } } 等关键词指定*/@PostMapping(value = "crud")  // 直接 {method} 或 apijson/{method} 会和内置网页的路由有冲突// @Overridepublic String crudAll(@RequestBody String request, HttpSession session) {return newParser(session, RequestMethod.CRUD).parse(request);}/**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率*/@PostMapping("{method}/{tag}")  // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method}/{tag} 或 Controller 注解 @RequestMapping("crud")@Overridepublic String crudByTag(@PathVariable String method, @PathVariable String tag, @RequestParam Map<String, 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)

请求样例

  1. 请求
curl --location --request POST 'http://localhost:8080/get' \
--header 'Content-Type: application/json' \
--data-raw '{"User[]":{"count":3,"User":[]}
}'
  1. 返回
{"User[]": [[],{"$ref": "$.User\\[\\][0]"},{"$ref": "$.User\\[\\][0]"}],"ok": true,"code": 200,"msg": "success","debug:info|help": " \n提 bug 请发请求和响应的【完整截屏】,没图的自行解决! \n开发者有限的时间和精力主要放在【维护项目源码和文档】上! \n【描述不详细】 或 【文档/常见问题 已有答案】 的问题可能会被忽略!! \n【态度 不文明/不友善】的可能会被踢出群,问题也可能不予解答!!! \n\n **环境信息**  \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"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端基础总结

1.将一个数组转换为另一个新的数组 在前端页面中&#xff0c;将数组A赋值给数组B&#xff0c;再将数组A赋值给数组C&#xff0c;改变数组C的值&#xff0c;数组A和数组B的值同时发生改变&#xff0c;因为3个数组都是指向同一内存地址&#xff0c;要避免这种情况&#xff0c;可…

SpringBoot项目使用CXF框架开发SOAP通信接口

文章目录 引言I SOAP1.1 SOAP消息组成1.2 XFire WebService 框架1.3 CXF框架II 测试访问webService效果2.1 浏览器访问暴露出的soap接口2.2 SOAP接口调试工具:SoapUI2.3 使用hutool的SoapClient调用soap接口2.4 使用cxf自带的工具请求webservice接口2.5 使用Postman测试工具来…

反激电源的类型与特点

主要分为 1 固定频率&#xff08;CCMDCM&#xff09; 2 可变频率控制&#xff08;CRM电流临界模式&#xff09; 这三种模式是很好辨别的&#xff0c;首先我们看左边的连续模式&#xff0c;Vds能看到他有一些尖峰毛刺&#xff0c;这是场效应管关闭的时候&#xff0c;LRC谐振导…

合势而上 聚力成峰 |“我店平台616购物嘉年华发布会”圆满落幕

引言 合势而上&#xff0c;聚力成峰&#xff1b;我店力量&#xff0c;势如破竹。 6月2日&#xff0c;“合势而上聚力成峰——我店平台616购物嘉年华发布会”于杭州顺利举办。会上&#xff0c;我店平台董事长肖翰成携手公司一众高管&#xff0c;正式启动“我店平台616购物嘉年华…

Java中getBytes()方法

我以为旅人将我 热情都燃尽 —— 24.6.4 String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示 而与getBytes相对的&#xff0c;可以通过new String(byte[], decode)的方式来还原这个“深”字时&#xff0c;这个new String(byte[],…

移位运算绝佳的应用

先想一下&#xff0c;如果要给你一个数对应的补码形式&#xff0c;你要计算这个数的1的数目&#xff0c;你有几种做法呢&#xff08;针对负数的补码也是否能够计算呢&#xff09;&#xff1a; 3种思路分享给你&#xff1a; 整完看看后面的思考题&#xff0c;c一下 first. v…

Git 保留空文件夹结构

假设有如下 helloworld 项目结构&#xff1a; helloworld|--.git|--.gitignore|--Builds|--WebGL|--iOS|--Android现在有个需求&#xff0c;在上传到 github 仓库时&#xff0c;只想保留 WebGL、iOS、Android 文件夹的结构&#xff0c;不想要里面的内容&#xff0c;可以按以下…

屏幕录制工具分享6款,附上详细电脑录屏教程(2024全新)

当你即将参加一个重要的在线会议或一堂关键的直播课&#xff0c;但又担心错过关键点或无法及时做笔记时&#xff0c;屏幕录制无疑是最好的方法之一。屏幕录制是一项非常有价值的技能&#xff0c;它能让你出于各种目的捕捉屏幕上的活动。无论你的目的是创建教程、演示软件功能、…

HiveMetastore

HiveMetastore 背后的存储 select * from DBS; select * from TBLS; select * from TABLE_PARAMS; 查找出没有 totalSize stats 的table SELECT DBS.NAME,t.TBL_NAME from DBS inner join (select DB_ID,TBL_NAME from TBLS where TBLS.TBL_ID not in(select TBL_ID from T…

家里总是“飞尘、毛絮”多怎么办?用这个东西教你轻松解决难题

每次清洁家里卫生的时候&#xff0c;都会发现家里空气中飘浮着毛毛和灰尘&#xff0c;地板上、沙发套、床单被罩都是毛毛。明明每天清洁&#xff0c;为什么家里还有这么多“飞尘、毛絮”呢&#xff1f;如果不将这些“飞尘、毛絮”清洁干净&#xff0c;空气中的飞尘、毛絮进入我…

<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

任务3.3 学生喂养三种宠物:猫、狗和鸟

本任务旨在通过Java面向对象编程中的多态性和方法重载概念&#xff0c;实现一个学生喂养三种不同宠物&#xff08;猫、狗、鸟&#xff09;的程序。 定义基类和派生类 创建一个Animal基类&#xff0c;包含所有动物共有的属性和方法&#xff0c;如name、age、speak()、move()和ea…

一篇文章讲透排序算法之归并排序

0.前言 本篇文章将详细解释归并排序的原理&#xff0c;以及递归和非递归的代码原理。 一.概念 归并排序是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使…

虚拟机Ubuntu 22.04上搭建GitLab操作步骤

GitLab是仓库管理系统&#xff0c;使用Git作为代码管理工具。GitLab提供了多个版本&#xff0c;包括社区版(Community Edition)和企业版(Enterprise Edition)。实际应用场景中要求CPU最小4核、内存最小8GB&#xff0c;非虚拟环境。 以下是在虚拟机中安装社区版步骤&#xff1a;…

git获取的项目无法运行

一、Unsupported engine 问题&#xff1a;在使用命令npm install下载依赖项的时候就遇到了这个问题&#xff0c;有帖子说多试几次&#xff0c;其实这是提示node版本问题&#xff0c;版本的更新出现兼容性问题&#xff0c;多试几次也没用。 解决方案&#xff1a; 更新node.js的…

【Python】使用flask作为web服务器

一、flash轻量级web框架介绍 Python Flask 框架是一个轻量级的 Web 框架&#xff0c;它简单易用&#xff0c;灵活多变&#xff0c;非常适合用于构建小型到中型规模的 Web 应用程序。以下是 Flask 框架的详细介绍&#xff1a; 1、基本概念 Flask 是一个基于 Python 的微型 We…

Paper速读-[Visual Prompt Multi-Modal Tracking]-Dlut.edu-CVPR2023

文章目录 简介关于具体的思路问题描述算法细节实验结果模型的潜力模型结果 论文链接&#xff1a;Visual Prompt Multi-Modal Tracking 开源代码&#xff1a;Official implementation of ViPT 简介 这篇文章说了个什么事情呢&#xff0c;来咱们先看简单的介绍图 简单来说&…

【玩转C语言】第一讲--->C语言概念

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 引言&#xff1a; 1. C语言是什么 2. C语言的辉煌历史 3. 第一个C语言程序 4. main()函数 5. printf() 函数 6. 库函数 6.1 库函数概念 7. 关键字介绍 …

工具:一键采集 平台:TB+PDD+JD...

什么是数据集&#xff1f; 电商商品数据集通常是指收集自电子商务平台的商品信息的结构化数据集合。这些数据包括但不限于商品名称、价格、描述、用户评价、分类标签、卖家信息、销售量、库存量、图片链接等。数据集可以由电商平台公开提供&#xff0c;也可以通过网络爬虫等技术…

沟通技巧(Communication Skills 业务分析能力)

背景 业务分析的胜任力模型&#xff0c;有六大部分&#xff0c;今天我们看第二部分&#xff0c;业务知识 Analytical Thinking and Problem Solving &#xff1a;分析判断及问题解决能力Behavioural Characteristics&#xff1a; 行为特质&#xff08;责任、道德、适应性等等…