13 MagicAPI快速入门
经理:小王,隔壁组要读我们的数据,赶紧把接口程序做一下!
经理:小王,五年前的jsp项目,能不能把商品信息改造一下,做一个数据api?
经理:小王,明天要给可以做一个大屏展示,今天能把数据接口调好吗?、
王小面:我太难了@~@
经理:你还在手工写 RestController?试试 “接口配置服务” 啊
Magic-API 是什么
Magic-API是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口
无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发。
简化所需Java知识背景,只要会写SQL,直接就能做数据
一、特点
支持常规关系型数据库,比如MySQL,Oracle等常见的
Redis、MongoDB、ES等非关系型,DataW等同类产品不支持
配置数据以文件形式存放,DataW等需要建个数据库存配置
支持在线调试
支持参数配置,比如必填、格式等等
支持Linq,做.net的觉得很好,未来可期
支持API实现上传下载
支持脚本中混排Java代码
支持脚本的版本管理
二、尝试使用
2.1 准备工作
数据库:MySQL
表:用户信息表 t_user
image.png
2.2 目标
不写Controller、Service、Dao等针对此表的Java代码
快速创建针对表CRUD的API
实现复杂的查询数据API
接口参数控制管理
三、开发步骤
3.1 创建新项目
1.新建SpringBoot项目:magicdemo,包名 com.demo.magic
2.pom.xml加入以下内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.taotao</groupId>
<artifactId>magicdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>magicdemo</name>
<description>magicdemo</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.4.2</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.ssssssss</groupId>
<artifactId>magic-api-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.taotao.magicdemo.MagicdemoApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3.配置application.yml
简易配置,只需配置以下内容
magic-api:
resource:
location: d:/cfg/magic-api #配置文件存储位置。当以classpath开头时,为只读模式
web: /magic/web #配置web页面入口
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
如果需要,可以对magic-api的内容做更复杂的配置,例如:
magic-api:
resource:
location: d:/cfg/magic-api #配置文件存储位置。当以classpath开头时,为只读模式
web: /magic/web #配置web页面入口
page: # 可不配置, 后续内容全会用默认值
size: size # 页大小的请求参数名称 缺省时为size
page: page # 页码的请求参数名称 缺省时为page
default-page: 1 # 自定义默认首页 缺省时为1
default-size: 10 # 自定义为默认页大小 缺省时为10
response-code: # 可不配置
success: 200 #执行成功的code值
invalid: 400 #参数验证未通过的code值
exception: 500 #执行出现异常的code值
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
复杂配置可对分页、状态码等内容做自定义,具体可参考官方文档 https://www.ssssssss.org/magic-api
配置完成后,启动boot项目,控制台将会出现以下文字:
********************************************当前服务相关地址********************************************
服务启动成功,magic-api已内置启动! Access URLs:
接口本地地址: http://localhost:8080/
接口外部地址: http://172.16.0.107:8080/
接口配置平台: http://172.16.0.107:8080/magic/web/index.html
可通过配置关闭输出: magic-api.show-url=false
********************************************当前服务相关地址********************************************
此时打开配置平台地址就可以使用了,完全不用写业务代码
3.2 配置CRUD的API
本阶段目标:
1.通过配置完成 t_user 表的CRUD功能实现
2.仅做脚本配置,不写任何一个java文件
3.2.1 创建分组
点击新建分组
组名:用户管理
路径:user
3.2.2 创建查询列表
1.右键分组user,新建接口
2.下方接口信息里输入:
请求方法:get
接口名称:查询全部用户
接口路径:listall
3.右侧的大文本框内,输入以下脚本
return db.table('t_user').select()
4.点击右上方运行,或者ctrl+Q,就会在下方控制台输出响应内容
{
"code": 200,
"message": "success",
"data": [{
"id": 1,
"account": "xiaoming",
"name": "小明",
"gender": "男",
"avatar": "https://www.qq.com/logo.png"
}, {
"id": 2,
"account": "xiaohong",
"name": "小红",
"gender": "女",
"avatar": "https://www.qq.com/logo2.png"
}],
"timestamp": 1660810934840,
"executeTime": 30
}
我们第一个API就实现完成了。
此时可以使用发布路径调试,在浏览器访问 http://172.16.0.107:8080//user/listall
就会看到和调试相同的结果。
3.2.3 创建保存方法
保存API的实现,我们要求请求传入body,为json格式的t_user表内容,然后进行保存
1.右键分组user,新建接口
2.下方接口信息里输入:
请求方法:post
接口名称:保存新用户
接口路径:save
3.右侧的大文本框内,输入以下脚本
return db.table('t_user').insert(body)
4.在下方接口信息的请求body里,输入以下内容,t_user表的id设为自增,body不赋值
{
"account": "xiaoling",
"name": "小玲",
"gender": "女",
"avatar": "https://www.qq.com/face.png"
}
5点击右上方运行,就会在下方控制台输出响应内容
{
"code": 200,
"message": "success",
"data": 4,
"timestamp": 1660811763708,
"executeTime": 22
}
5.此时查询数据库,就会看到新插入的记录了
3.2.4 创建更新方法
更新和保存很相似,仍然是通过post,将body内容更新数据表
1.前面步骤类似,创建update接口,脚本内容为:
# primary表示根据主键id进行更新
return db.table('t_user').primary("id").update(body)
2.测试body如下:
{
"id": 3,
"account": "xiaoling3",
"name": "小玲3",
"gender": "男",
"avatar": "https://www.qq.com/face3.png"
}
结果提示成果,数据表内容也改了。
3.2.5 saveOrUpdate的实现
经常使用ORM的同学,习惯于用saveOrUpdate的方式,自动决定insert还是update,脚本里可以使用save实现:
# 1. 如果body里有id,则是update,否则是insert
db.table('t_good').primary('id').save(body)
# 2. 显式调用insert / update
db.table('t_good').primary('id').insert(body)
db.table('t_good').primary('id').update(body)
public Integer saveDataSource(Long id, String url, String username, String password, String driverName) {
Map<String, Object> params = new HashMap<>();
params.put("name", "共享交换dbs" + id);
params.put("key", "key_" + id);
params.put("url", url);
params.put("username", username);
params.put("password", password);
params.put("driverClassName", driverName);
params.put("maxRows", -1);
params.put("groupId", "datasource:0");
params.put("type", "com.zaxxer.hikari.HikariDataSource");
// params.put("id", "093fab55969543dc99f68eaef4e4067a");
ResponseEntity<String> responseEntity = null;
try{
responseEntity = restTemplate.postForEntity(URL + "magic/web/resource/file/datasource/save", params, String.class);
if(HttpStatus.OK.equals(responseEntity.getStatusCode())) {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(responseEntity.getBody());
String message = jsonNode.get("message").asText();
if("success".equals(message)){
return 1;
}else {
log.info(message);
return 0;
}
} else {
log.info(responseEntity.getBody());
return 0;
}
} catch (Exception e){
log.info(e.getMessage());
return 0;
}
}