使用 Spring Boot 创建动态 REST 端点

use*_*642 1 java rest spring spring-boot

我正在开发一个框架,该框架具有 Spring Boot Java 层和包含核心逻辑的 C++ 层。C++ 层是模块化的,因此许多具有独特职责和命令的服务共享公共组件,包括命令处理器。命令处理器通过 Thrift RPC 与 Java 层(对于所有服务也是一样)进行通信。

目前,用户通过指定命令名称和参数集,通过 Java 级别的单个executeCommand REST 端点执行命令。

POST http://localhost:8388/framework/executeCommand

JSON 正文 {"commandName": "aCommand", "parameters": {"param1": "value1", "param2": "value2"}}

有没有办法根据 C++ 层提供的命令集动态生成 REST 端点?例如...每个命令都有一个端点,例如

POST http://localhost:8388/framework/aCommand

JSON 正文 {"parameters": {"param1": "value1", "param2": "value2"}}

或者

获取 http://localhost:8388/framework/aCommand?param1=value1

例如...在启动时,Java 层将查询 C++ 层以获取命令集和其他相关信息,例如适当的 REST 方法。有了这些信息,Java 层将为每个命令生成一个端点。

谢谢!

dek*_*ard 5

您可以在 REST 控制器中使用路径变量来接受不同的命令类型,如下所示:

@RestController
@RequestMapping("/command")
@RequiredArgsConstructor
class CommandController {

    private final CommandService commandService;

    @PutMapping("/{commandType}")
    public CommandResult handleCommand(@PathVariable("commandType") String commandType,
                                       @RequestParam Map<String, String> params) {
        return commandService.execute(commandType, params);
    }
}
Run Code Online (Sandbox Code Playgroud)

(这CommandService是一个在启动时加载可用命令,然后验证并执行请求的命令的服务)。

然后,您可以运行带有类似请求的命令PUT http://localhost:8080/command/someCommand?param1=value1&param2=value2

更新

针对明确需求的一些解决方案(动态 REST 控制器创建):