目 录CONTENT

文章目录

SpringBoot 使用 magic-api 实现动态接口

码农街
2023-08-09 / 0 评论 / 0 点赞 / 45 阅读 / 15975 字 / 正在检测是否收录...

一、Magic-api 介绍

一个基于Java的接口快速开发框架,通过magic-api提供的UI界面完成编写接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发。

二、快速开始(官方)

  1. 数据库创建

创建一张测试表TestData,结构如下

id

name

1

magicApi

2

xiaoDong

DDL如下:

create table test_data
(
    id   bigint       not null primary key,
    name varchar(100) null
 );

INSERT INTO test_data (id, name) VALUES (1, 'magicApi');
INSERT INTO test_data (id, name) VALUES (2, 'xiaoDong');
  1. 初始化工程

创建一个空的Spring Boot工程, 以mysql作为默认数据库进行演示。

  1. 添加依赖

引入Spring Boot Starter父工程:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.3</version>
    <relativePath/>
</parent>

引入magic-api-spring-boot-starter依赖。

<dependency>
    <groupId>org.ssssssss</groupId>
    <artifactId>magic-api-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

引入spring-boot-starter,spring-boot-starter-web, spring-boot-starter-test, mysql依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>
  1. 配置

application.yml

server:  
    port: 9999
magic-api:  #配置web页面入口  
    web: /magic/web  
    resource:
        type: file
        #type: database  # 配置接口存储方式,这里选择存在数据库中 默认file
        #table-name: magic_api_file  # 数据库中的表名
        #prefix: /magic-api  # 前缀          
        #配置文件存储位置。当以classpath开头时,为只读模式    
        #mac用户请改为可读写的目录    
        #如果不想存到文件中,可以参考配置将接口信息存到数据库、Redis中(或自定义)    
        location: classpath:magic-api
spring:  
    datasource:    
        driver-class-name: com.mysql.jdbc.Driver    
        url: jdbc:mysql://localhost:3306/magic-api-test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8    
        username: root    
        password: test
  1. 访问api管理界面

启动项目之后,访问http://localhost:9999/magic/web 即可看到Web页面

  1. 三分钟写出查询接口

    • 创建分组

点击创建分组按钮后,输入分组信息,点击创建。

  • 新建接口

右键分组,点击新建接口。

在编辑器输入内容后,填写接口名称和及其路径。

var sql = """
select * from test_data
"""

return db.select(sql)

   ctrl+s保存后,即可访问接口。

  • 访问接口

curl http://localhost:9999/test/test

{
    "code": 1,
    "message": "success",
    "data": [{
        "name": "magicApi"
    }, {
        "name": "xiaoDong"
    }],
    "timestamp": 1694001305333,
    "executeTime": 10
}

   也可以通过web界面执行。

三、插件

目前官方提供以下插件:

  1. 集群插件

  2. 定时任务插件

  3. Redis插件

  4. Mongo插件

  5. Elasticsearch插件

  6. Swagger插件

  7. Git插件

  8. SpringDoc插件

  9. nebula插件

有兴趣的可以去看下,magic-api插件

四、脚本与Java交互

  1. 脚本调用Java

  • 注入Spring Bean

// 第一种方式
import xx.xxx.xxx.xxx.UserService;    
// 使用类名
return UserService.selectUserList();
// 第二种方式
import "userUservice" as userService;   
// 使用Bean名
return userService.selectUserList();
  • 调用静态方法

import xxx.xxx.xx.xx.xx.StringUtils;
return StringUtils.isBlank("");
  • 调用普通方法

// 对于java.util、java.lang 包下的类,可以直接使用。
return new ArrayList();
// 对于其他类需要
importimport "java.text.SimpleDateFormat";
return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  • 调用magic-api的接口

// 可以在脚本中直接调用,非http方式
import "@get:/api/sys/user/list" as userList;   
// 导入定义的GET请求的 /api/sys/user/list 接口。
// 脚本中变量是共享给调用者的。所以无需指定参数传入。只需要在本脚本中定义该变量即可。
return userList();
  • 调用magic-api的函数

import "@/common/encode/md5" as md5;   
// 导入页面上定义的函数信息
return md5('123456');
  1. Java调用接口

  • 调用接口

@Autowired
MagicAPIService service;
Map<String, Object> params = new HashMap<>();// 注入变量信息
params.put("id", 123);
// 内部调用接口不包含code以及message信息,同时也不走拦截器。
Object value = service.execute("GET", "/hello", params);
// 内部调用接口包含code以及message信息,同时也不走拦截器。
Object value = service.call("GET", "/hello", params);
  • 调用函数

@Autowired
MagicAPIService service;
Map<String, Object> params = new HashMap<>();
// 注入变量信息
params.put("a", 1);
params.put("b", 1);
// 调用函数
Object value = service.invoke("/test/add", params);
  • 保存资源

@Autowired
MagicResourceService service;
// 保存分组信息
service.saveGroup(group);
// 保存接口(ApiInfo)、函数(FunctionInfo)、数据源(DataSourceInfo)
service.saveFile(apiInfo);
  • 删除资源

@Autowired
MagicResourceService service;
// 删除分组或文件
service.delete(id);
  • 资源列表

@Autowired
MagicResourceService service;
// 获取分组下的所有文件
service.listFiles(groupId);
// 获取接口(api)、函数(function)、数据源(datasource)列表
service.files(type);
// 获取接口(api)、函数(function)、数据源(datasource)树结构
service.tree(type);
// 获取全部资源的树结构
service.tree();
  • 其它API

除了以上列举的API以外 MagicAPIService还有

/**
* 上传
*/
boolean upload(InputStream inputStream, String mode) throws IOException;

/**
* 下载
*/
void download(String groupId, List<SelectedResource> resources, OutputStream os) throws IOException;

/**
* 推送
*/
JsonBean<?> push(String target, String secretKey, String mode, List<SelectedResource> resources);

/**
* 处理刷新通知
*/
boolean processNotify(MagicNotify magicNotify);

MagicResourceService 还有以下方法

/**
* 刷新缓存
*/
void refresh();

/**
* 移动
*
* @param src     源ID
* @param groupId 目标分组
*/
boolean move(String src, String groupId);

/**
* 复制分组
*
* @param src    源ID
* @param target 目标分组
*/
String copyGroup(String src, String target);

/**
* 获取文件详情
*/
<T extends MagicEntity> T file(String id);

/**
* 获取分组详情
*/
Group getGroup(String id);

/**
* 获取完整分组路径
*/
String getGroupPath(String groupId);

/**
* 获取完整分组名称
*/
String getGroupName(String groupId);

0

评论区