让我们看看如何定义一个自定义API,以返回使用Spring Boot应用程序公开的所有端点的列表。
在网上寻找在Spring Boot应用程序中检索所有已部署端点的方法时,我发现存在RequestMappingHandlerMapping。
Spring Boot使用此类来执行每个带有注释的方法,@RequestMapping 并包含所有方法的列表,尤其是应用程序所有公开的端点的列表。
这就是为什么实现这样的API比您想象的要容易的原因。这可以通过以下方式实现:
@RestController @RequestMapping("/monitoring/") public class MonitoringController { @Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping;
@GetMapping("endpoints") public ResponseEntity<List<String>> getEndpoints() { return new ResponseEntity<>( requestMappingHandlerMapping .getHandlerMethods() .keySet() .stream() .map(RequestMappingInfo::toString) .collect(Collectors.toList()), HttpStatus.OK ); } }
|
Kotlin:
@RestController @RequestMapping("/monitoring/") class MonitoringController { @Autowired private lateinit var requestMappingHandlerMapping : RequestMappingHandlerMapping
@GetMapping("endpoints") fun getEndpoints() : ResponseEntity<List<String>> { return ResponseEntity( requestMappingHandlerMapping .handlerMethods .map { it.key.toString() }, HttpStatus.OK ) } }
|
在这两种情况下,我都使用handlerMethods属性,该属性存储具有所有映射和HandlerMethod的只读映射。映射是条目的键,并由RequestMappingInfo对象表示。他们的toString()方法返回到达与HandlerMethod对象关联的端点所需的全部信息。
这是此API响应示例:
[ “ {GET / monitoring / endpoints}”, “ {GET / v1 / genres}”, “ {GET / v1 / genres / {id}}”, “ {POST / dex / v1 / genres}”, “ {PUT / v1 / genres / {id}}”, “ {DELETE / v1 / genres / {id}}”, “ {PATCH / v1 / genres / {id}}”, “ {GET / v1 / books}”, “ {GET / v1 / books / {id}}”, “ {POST / dex / v1 / books}”, “ {PUT / v1 / books / {id}}”, “ {Delete / v1 / books / {id} }”, “ {PATCH / v1 / books / {id}}”, “ {GET / v1 / authors}”, “ {GET / v1 / authors / {id}}”, “ {POST / dex / v1 / authors }“, ”{PUT / v1 / authors / {id}}”, “ {DELETE / v1 / authors / {id}}”, “ {PATCH / v1 / authors / {id}}”, “ {GET / v1 / authors / {id} / books}” ]
|