java - 如何从包含 url 的文件自动生成 REST 端点?

标签 java spring api swagger documentation

我有一个文件,其中包含必须在 REST API 上公开的 URL。所有 URL 都代表不同的资源,它们必须单独记录。该文件包含数百个 URL,例如:

/p1
/p1/p2
/p1/p2/p3
/t1
/t1/t2
/t1/t2/t3
我想自动/以编程方式生成 REST 端点,以便我能够调用:
GET on https://host/p1/
GET on https://host/p1/p2
GET on https://host/p1/p3

... and so on ...
处理请求背后的逻辑对于每个路径都是相似的,因此/p1、/p1/p2、/t1 等可以由接收整个路径的单个函数处理。为了处理请求,我有一个这样的功能:
function handleRequest(url) {
    // this function should be called for every GET request on any of those endpoints
    // perform the business logic here 
}
数据存储在树数据结构中,因此获取树中的路径并返回路径指向的节点下的数据是有意义的。但是,所有这些路径都是单独的资源。
我正在用 Java 编写代码,但目前该语言并不重要。我会像这样在 Spring 中生成一个 REST 端点:
    @RequestMapping(
        path = "/t1",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE,
        consumes = MediaType.APPLICATION_JSON_VALUE,
        headers = "Accept=application/json"
    )
    public ResponseEntity getT1() {
       // handle request here
    }
但是,由于必须通过 API 公开的资源数量非常多,因此在处理请求的逻辑相同的情况下,编写上述函数数百或数千次是极其困难的。
我发现的一种解决方案是使用 PathPatterns .这将需要一个带有像“/commonPath/**”这样的 url 的 RequestMapping。此解决方案的缺点是我无法通过 Swagger 为 API 自动生成文档,因为只有一个入口点。
如何自动生成所有这些端点?
编辑
文档基本上归结为有一种自动方式来告诉用户可以调用哪些可用端点。我不想手动编写/维护它,因为 URL 的数量非常多。使用 Swagger,它非常简单。只需注释端点,就会为 API 的客户端自动生成用户界面。

最佳答案

我想了解有关您的方案的更多详细信息,但这里是根据当前给定信息的可能选项。
解决方案1:如果您的输入文件是静态的,并且您需要基于静态输入文件公开 API,那么此解决方案可能会运行良好。只需编写一个程序即可根据文件生成 Controller 类。

@RestController
public class MyMultiPathApiController {

    @AutoWired
    private RestApiHandlerService restApiHandlerService

    @RequestMapping(
  value = { "/p1", "/p1/p2", "/p1/p2/p3" }, 
  method = GET)
    public ResponseEntity<?> myMultiRestApi() {
        return restApiHandlerService.handleApiLogic();
    }
}
或者,请求映射也接受正则表达式。根据您提供的示例,您也可以想出一个正则表达式。
方案二(推荐方案):
如果您的文件预计会更改并且您想动态公开 API,那么您需要调整 spring 框架的 RequestMappingHandlerMapping类(class)。扩展类(class) RequestMappingHandlerMapping并写出你想写的逻辑。您可以在应用程序启动时读取文件并缓存它。您可以引用一些关于编写自定义 RequestMappingHandlerMapping 类的示例 here .
我相信这些信息很有帮助。如果您有任何后续问题,请告诉我。

关于java - 如何从包含 url 的文件自动生成 REST 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64445112/

相关文章:

wordpress rest api 仅通过 url 获取发布数据

java - 从哪里可以获得有关 Java OpenStreetMap API 的更多信息?

java - 在java中将对象转换为映射

java - hibernate 多对多

java - 验证时 Powermock 的计数比实际调用的计数多

java - MySQL : multiple table insert with foreign key relationship

java - 在运行时,有没有办法检查哪个 API/ Controller 方法导致 Spring Boot 应用程序中的当前执行点?

java - 为 @ExceptionHandler 中的每个异常生成正确的状态

javascript - 如果没有自动启动,则无法让 SoundCloud API 播放

java - 如何从静态内部类构造函数创建 Spring bean?