需求说明
有少数几个接口需要在多个项目中使用,如果按照正常的逻辑则是在每个项目中都编写 Controller
, Service
之类的,当然也可以将 Controller
和 Service
相关类放在 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-api
的 ui
控制台访问地址是 http://192.168.20.102:8081/magic/web/index.html
( magic/web
是 application.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
配置可以指向这个目录,因此想要动态更新接口,只需要将调整后的接口文件直接覆盖到对应的目录中即可