SpringBoot整合magic-api快速发布http接口

需求说明

有少数几个接口需要在多个项目中使用,如果按照正常的逻辑则是在每个项目中都编写 Controller, Service 之类的,当然也可以将 ControllerService 相关类放在 starter 中,被其他服务引入,如果不想把 Controller 相关代码放在 starter 中,这里提供另外的简易方式,就是使用 magic-api, 使用这种方式的好处是如果需求比较简单,则可以快速创建发布 http 接口,而且对于增量更新接口的话可以不用修改线上代码,修改外部配置文件即可

简介 | magic-api (ssssssss.org) magic-api-spring-boot-starter: magic-api spring-boot 版本 (gitee.com)

项目示例

pom 依赖

创建 Spring boot 项目,pom.xml 依赖如下

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>  
    <parent>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-parent</artifactId>  
        <version>2.6.15</version>  
        <relativePath/>
    </parent>  
    <groupId>com.example</groupId>  
    <artifactId>test-web</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
    <name>test-web</name>  
    <description>test-web</description>  
    <properties>  
        <java.version>17</java.version>  
    </properties>  
    <dependencies>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
        </dependency>  
        <!-- 以spring-boot-starter的方式引用 -->  
        <dependency>  
            <groupId>org.ssssssss</groupId>  
            <artifactId>magic-api-spring-boot-starter</artifactId>  
            <version>2.1.1</version>  
        </dependency>  
    </dependencies>  
  
    <build>  
        <plugins>  
            <plugin>  
                <groupId>org.springframework.boot</groupId>  
                <artifactId>spring-boot-maven-plugin</artifactId>  
            </plugin>  
        </plugins>  
    </build>  
</project>

application.properties 配置文件

properties 复制代码
server.port=8081  
  
# magic-api ui 界面的访问路径  
magic-api.web=/magic/web  
  
# magic-ui 访问的用户名和密码,如果不配置,则直接访问  
magic-api.security.username=admin 
magic-api.security.password=123456
  
#配置文件存储位置。当以classpath开头时,为只读模式,在开发阶段可以先配置目录,开发完成后导出接口,再配置成classpath模式,即生产环境是只读的  
#magic-api.resource.location=classpath:magic-api  
magic-api.resource.location=D:/magic-api

然后就可以启动项目,magic-apiui 控制台访问地址是 http://192.168.20.102:8081/magic/web/index.html ( magic/webapplication.properties 中自己配置的 ), 因为在 application.properties 中配置了 用户名和密码,所以访问界面时会需要先登录,登录后的界面如下所示

上图是添加接口后的样子,默认是空白的,在 1 处先点击 + 添加分组,然后鼠标点击分组名,右键就可以添加接口

上面接口实现逻辑中代码如下

java 复制代码
import com.example.OpsSpringBeanUtil;    // 使用类名
OpsSpringBeanUtil.publishEvent(body);
return 'Hello magic-api'

这里演示了调用项目中静态方法,看一下 OpsSpringBeanUtil 代码

java 复制代码
package com.example;  
  
import org.springframework.beans.BeansException;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.ApplicationContextAware;  
import org.springframework.stereotype.Component;  
  
@Component  
public class OpsSpringBeanUtil implements ApplicationContextAware {  
  
    private static ApplicationContext applicationContext;  
  
    @Override  
    public void setApplicationContext(ApplicationContext applicationContextParam) throws BeansException {  
        applicationContext = applicationContextParam;  
    }  
  
    public static Object getBean(String beanName) {  
        return applicationContext.getBean(beanName);  
    }  
  
    public static <T> T getBean(Class<T> clazz){  
        return applicationContext.getBean(clazz);  
    }  
  
    public static void publishEvent(Object event) {  
        applicationContext.publishEvent(event);  
    }  
}

然后可以直接在 magic-api 页面上执行接口,也可以通过 crul 形式,对于上面接口使用如下 curl 形式调用

css 复制代码
curl --location --request POST 'http://localhost:8081/send/outer/api/result' \
--header 'Content-Type: application/json' \
--data '{
  "errorCode": 0,
  "errorMsg": "errorMsg_89d4fa6125ce",
  "methodName": "methodName_8676620f0782"
}'

调用 SpringBean 对象方法

调用 SpringBean 对象方法可以参考 脚本调用Java | magic-api (ssssssss.org) 下面给出一个调用 SpringBean 对象的示例

java 复制代码
package com.example;  
import org.springframework.stereotype.Component;  
@Component  
public class DemoService {  
    public void doSomething() {  
        System.out.println("do something");  
    }  
}

magic-api 接口页面编写内容如下

发布到生产环境

前面在项目的 application.properties 中有如下配置

properties 复制代码
#配置文件存储位置。当以classpath开头时,为只读模式,在开发阶段可以先配置目录,开发完成后导出接口,再配置成classpath模式,即生产环境是只读的  
#magic-api.resource.location=classpath:magic-api  
magic-api.resource.location=D:/magic-api

在项目开发阶段将 magic-api 接口相关的文件放在了本地的某个目录,至于线上也可以放在外部目录,直接将 D:/magic-api 目录下的内容拷贝过去也行,如果不想放在外部目录,而是放在项目的 resources 目录下,则可以先导出接口文件

导出之后会下载一个 magic-api.zip 压缩文件,将该文件解压出来得到 magic-api 目录,然后将该目录拷贝到项目的 resources 目录下即可,然后将 application.properties 中配置修改成如下形式

properties 复制代码
#配置文件存储位置。当以classpath开头时,为只读模式,在开发阶段可以先配置目录,开发完成后导出接口,再配置成classpath模式,即生产环境是只读的  
magic-api.resource.location=classpath:magic-api
#magic-api.resource.location=D:/magic-api

使用 classpath 形式,再打开 magic-api 后就无法再对接口进行编辑

生产环境动态更新接口

通过上面的示例可知,magic-api 接口相关的文件完全可以放置在外部目录,在项目的配置文件中通过 magic-api.resource.location 配置可以指向这个目录,因此想要动态更新接口,只需要将调整后的接口文件直接覆盖到对应的目录中即可

相关推荐
小强19885 小时前
SQL Server 慢查询怎么定位?一套从“卡”到“快”的完整排查流程
后端
水深火乐5 小时前
interface和any
后端
步行cgn5 小时前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
神奇小汤圆5 小时前
Spring Boot + LangChain4j实现RAG——从零搭建企业级知识库问答系统
后端
H_Peak5 小时前
Python运算符与流程控制:if条件判断
后端
H_Peak6 小时前
Python字符串操作:从基础到正则入门
后端
自进化Agent智能体6 小时前
Hermes 子代理委派 —— 并行工作的艺术
后端
步行cgn6 小时前
MyBatis 动态 SQL 中的 <foreach> 标签完全解析
后端
lhldsg6 小时前
社区健身场地规划实战指南:从器材配置到智能化管理经验分享
java·开发语言·经验分享·小程序
LayZhangStrive6 小时前
后端通识 - 后端工程开发常用的流程图类别
java·流程图·后端开发