獲取方法

kaka布鲁斯發表於2024-10-28

當然可以,除了獲取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():獲取引數的型別名稱。

注意事項

  1. 其他方法型別:如果你還需要其他HTTP方法(如POST、PUT等)的引數資訊,可以擴充套件程式碼中的條件判斷。
  2. 引數註解:本示例僅處理了@RequestParam註解的引數。如果你有其他型別的註解(如@RequestBody),你可能需要相應地擴充套件程式碼。
  3. 預設值:引數的預設值資訊也會被列印出來。

透過這種方式,你可以動態地獲取到所有定義的GET請求的URL及其引數格式。這樣有助於你在啟動時進行檢查或生成文件。

相關文章