當然可以,除了獲取URL,還可以獲取每個GET請求的引數和它們的格式。我們可以擴充套件之前的程式碼,使其不僅能列印GET請求的URL,還能列印每個GET請求的引數格式。
下面是一個示例程式碼:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import javax.annotation.PostConstruct;
import java.lang.reflect.Parameter;
import java.util.Map;
@Component
public class EndpointLister {
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void printAllEndpoints() {
RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) {
RequestMappingInfo info = entry.getKey();
HandlerMethod method = entry.getValue();
// 獲取URL路徑
for (String url : info.getPatternsCondition().getPatterns()) {
// 獲取HTTP方法
for (RequestMethod requestMethod : info.getMethodsCondition().getMethods()) {
if (requestMethod == RequestMethod.GET) {
System.out.println("GET " + url);
// 獲取方法引數
Parameter[] parameters = method.getMethod().getParameters();
if (parameters.length > 0) {
System.out.print(" Parameters: ");
for (Parameter parameter : parameters) {
if (parameter.isAnnotationPresent(RequestParam.class)) {
RequestParam requestParam = parameter.getAnnotation(RequestParam.class);
System.out.print(requestParam.value() + " (" + parameter.getType().getSimpleName() + "), ");
} else {
System.out.print(parameter.getName() + " (" + parameter.getType().getSimpleName() + "), ");
}
}
System.out.println();
} else {
System.out.println(" No parameters");
}
}
}
}
}
}
}
示例Controller
假設你有以下幾個API端點:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/hello")
public String hello(@RequestParam(name = "name", required = false, defaultValue = "World") String name) {
return "Hello, " + name + "!";
}
@GetMapping("/sum")
public int sum(@RequestParam int a, @RequestParam int b) {
return a + b;
}
}
當你執行你的Spring Boot應用時,EndpointLister
元件會輸出如下內容:
GET /api/hello
Parameters: name (String),
GET /api/sum
Parameters: a (int), b (int),
詳細解釋
- Parameter:Java的
Parameter
類代表了方法的一個引數。 - RequestParam:Spring的
@RequestParam
註解,用來獲取請求引數。 - parameter.isAnnotationPresent(RequestParam.class):檢查引數是否帶有
@RequestParam
註解。 - parameter.getType().getSimpleName():獲取引數的型別名稱。
注意事項
- 其他方法型別:如果你還需要其他HTTP方法(如POST、PUT等)的引數資訊,可以擴充套件程式碼中的條件判斷。
- 引數註解:本示例僅處理了
@RequestParam
註解的引數。如果你有其他型別的註解(如@RequestBody
),你可能需要相應地擴充套件程式碼。 - 預設值:引數的預設值資訊也會被列印出來。
透過這種方式,你可以動態地獲取到所有定義的GET請求的URL及其引數格式。這樣有助於你在啟動時進行檢查或生成文件。