Springboot项目如何获取所有的接口

时间:2021-09-09 05:24:46

Springboot项目获取所有接口

@Autowired
private WebApplicationContext applicationContext; 
@Override
public List getAllUrl() {
  RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
  // 获取url与类和方法的对应信息
  Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();

  List<Map<String, String>> list = new ArrayList<Map<String, String>>();
  for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) {
      Map<String, String> map1 = new HashMap<String, String>();
      RequestMappingInfo info = m.getKey();
      HandlerMethod method = m.getValue();
      //获取当前方法所在类名
      Class<?> bean = method.getBeanType();
      //使用反射获取当前类注解内容
      Api api = bean.getAnnotation(Api.class);
      RequestMapping requestMapping = bean.getAnnotation(RequestMapping.class);
String[] value = requestMapping.value();
map1.put("parent",value[0])
      //获取方法上注解以及注解值
      ApiOperation methodAnnotation = method.getMethodAnnotation(ApiOperation.class);
      String privilegeName = methodAnnotation.notes();
      PatternsRequestCondition p = info.getPatternsCondition();
      for (String url : p.getPatterns()) {
          map1.put("url", url);
      }
      map1.put("className", method.getMethod().getDeclaringClass().getName()); // 类名
      map1.put("method", method.getMethod().getName()); // 方法名
      RequestMethodsRequestCondition methodsCondition = info.getMethodsCondition();
      for (RequestMethod requestMethod : methodsCondition.getMethods()) {
          map1.put("type", requestMethod.toString());
      }
      
      list.add(map1);
  } 
 return list;
}

 

获取项目下所有http接口的信息

 

一、接口信息类

新建一个类用于存放http接口的相关信息

class RequestToMethodItem {
	public String controllerName;
  public String methodName;
  public String requestType;
  public String requestUrl;
  public Class<?>[] methodParmaTypes;    
  public String getControllerName() {
		return controllerName;
	}
	public void setControllerName(String controllerName) {
		this.controllerName = controllerName;
	}
	public String getMethodName() {
		return methodName;
	}
	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}
	public String getRequestType() {
		return requestType;
	}
	public void setRequestType(String requestType) {
		this.requestType = requestType;
	}
	public String getRequestUrl() {
		return requestUrl;
	}
	public void setRequestUrl(String requestUrl) {
		this.requestUrl = requestUrl;
	}
	public Class<?>[] getMethodParmaTypes() {
		return methodParmaTypes;
	}
	public void setMethodParmaTypes(Class<?>[] methodParmaTypes) {
		this.methodParmaTypes = methodParmaTypes;
	}
  public RequestToMethodItem(String requestUrl, String requestType, String controllerName, String requestMethodName, Class<?>[] methodParmaTypes){
      this.requestUrl = requestUrl;
      this.requestType = requestType;
      this.controllerName = controllerName;
      this.methodName = requestMethodName;
      this.methodParmaTypes = methodParmaTypes;
  }
}

二、单元测试

写两个http接口用于测试

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
	@GetMapping(value = "/test1")
	@ResponseBody
	public void test1(Integer a) {
	}
	
	@PostMapping(value = "/test2")
	@ResponseBody
	public void test2(Integer a,Integer b) {
	}
}

测试单元

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import cn.hutool.json.JSONUtil; //hutool是一个很方便的工具包
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {	
  @Autowired
  WebApplicationContext applicationContext;
  
	@org.junit.Test
	public void index() {
		List<RequestToMethodItem> requestToMethodItemList = new ArrayList<RequestToMethodItem>();
      RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
      Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
		for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods
				.entrySet()) {
			RequestMappingInfo requestMappingInfo = requestMappingInfoHandlerMethodEntry.getKey();				
			RequestMethodsRequestCondition methodCondition = requestMappingInfo.getMethodsCondition();
			PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
			HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();
			
			// 请求类型
			String requestType = methodCondition.getMethods().toString();			
			// 请求路径
			String requestUrl = patternsCondition.getPatterns().iterator().next();
			// 控制器名称
			String controllerName = mappingInfoValue.getBeanType().toString();
			// 请求方法名
			String requestMethodName = mappingInfoValue.getMethod().getName();
			// 请求参数
			Class<?>[] methodParamTypes = mappingInfoValue.getMethod().getParameterTypes();
			
			// Spring通过BasicErrorController进行统一的异常处理,不计入这些API
			if("class org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController".equals(controllerName)) {
				continue;
			}
			
			RequestToMethodItem item = new RequestToMethodItem(requestUrl, requestType, controllerName,
					requestMethodName, methodParamTypes);
			requestToMethodItemList.add(item);						
		}
		
		System.out.println(JSONUtil.toJsonStr(requestToMethodItemList));		
	}
}

测试结果

Springboot项目如何获取所有的接口

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_33371766/article/details/110248376