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 配置可以指向这个目录,因此想要动态更新接口,只需要将调整后的接口文件直接覆盖到对应的目录中即可

相关推荐
Asthenia04127 分钟前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia041215 分钟前
Spring 启动流程:比喻表达
后端
Asthenia041239 分钟前
Spring 启动流程分析-含时序图
后端
ONE_Gua43 分钟前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫
致心44 分钟前
记一次debian安装mariadb(带有迁移数据)
后端
未完结小说1 小时前
RabbitMQ高级(一) - 生产者可靠性
后端
探索为何1 小时前
JWT与Session的实战选择-杂谈(1)
后端·面试
咖啡教室1 小时前
java日常开发笔记和开发问题记录
java
咖啡教室1 小时前
java练习项目记录笔记
java
Asthenia04121 小时前
面试官让我介绍 Atomic 原子类有哪些?底层的实现机制是什么?
后端