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

Adr*_*gru 7 java api documentation spring swagger

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

/p1
/p1/p2
/p1/p2/p3
/t1
/t1/t2
/t1/t2/t3
Run Code Online (Sandbox Code Playgroud)

我想自动/以编程方式生成 REST 端点,以便我能够调用:

GET on https://host/p1/
GET on https://host/p1/p2
GET on https://host/p1/p3

... and so on ...
Run Code Online (Sandbox Code Playgroud)

处理请求背后的逻辑对于每个路径都是相似的,因此 /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 
}
Run Code Online (Sandbox Code Playgroud)

数据存储在树数据结构中,因此获取树中的路径并返回路径指向的节点下的数据是有意义的。但是,所有这些路径都是单独的资源。

我正在用 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
    }
Run Code Online (Sandbox Code Playgroud)

但是,由于必须通过 API 公开的资源数量非常多,因此在处理请求的逻辑相同的情况下,编写上述函数数百或数千次是极其困难的。

我发现的一种解决方案是使用PathPatterns。这将需要一个带有像“/commonPath/**”这样的 url 的 RequestMapping。此解决方案的缺点是我无法通过 Swagger 为 API 自动生成文档,因为只有一个入口点。

如何自动生成所有这些端点?

编辑

文档基本上归结为有一种自动方式来告诉用户可以调用哪些可用端点。我不想手动编写/维护它,因为 URL 的数量非常多。使用 Swagger,它非常简单。只需注释端点,就会为 API 的客户端自动生成用户界面。

lok*_*oki 3

我希望了解有关您的情况的更多详细信息,但根据目前给定的信息,以下是可能的选项。

解决方案 1: 如果您的输入文件是静态的,并且您需要基于静态输入文件公开 API,那么此解决方案可能会很有效。只需编写一个程序,根据该文件生成控制器类即可。

@RestController
public class MyMultiPathApiController {

    @AutoWired
    private RestApiHandlerService restApiHandlerService

    @RequestMapping(
  value = { "/p1", "/p1/p2", "/p1/p2/p3" }, 
  method = GET)
    public ResponseEntity<?> myMultiRestApi() {
        return restApiHandlerService.handleApiLogic();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,请求映射也接受正则表达式。根据您给出的示例,您也可以想出正则表达式。

方案2(推荐方案):

如果您的文件预计会更改并且您希望动态公开 API,那么您需要调整 spring 框架的RequestMappingHandlerMapping 类。扩展类RequestMappingHandlerMapping 并编写您想要编写的逻辑。您可以在应用程序启动时读取该文件并将其缓存。您可以在此处参考一些有关编写自定义 RequestMappingHandlerMapping 类的示例。

我相信这些信息很有帮助。如果您有任何后续问题,请告诉我。