如何使用簡單程式碼列出Spring Boot暴露的所有端點? - Zanini

發表於2021-01-19

讓我們看看如何定義一個自定義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}”     
]

 

相關文章