Как захватить Http-глагол и конечную точку api с помощью AOP в приложении Spring Boot

#spring #spring-boot #aop #spring-aop

#весна #spring-boot #aop #spring-aop

Вопрос:

Я планирую реализовать аспект, чтобы захватить следующие значения для данного rest API при успешном возврате в моем приложении spring boot:

  1. конечная точка api, например, /api/ …
  2. Http-глагол. т. е. PUT / POST и т. Д
  3. Полезная нагрузка запроса и параметр запроса / запроса

Я делаю это следующим образом:

 @Aspect
public class MyAspect {

  private final Logger log = LoggerFactory.getLogger(this.getClass());


  @Pointcut("within(com.web.rest.*)")
  public void applicationResourcePointcut() {
  }

  @AfterReturning(value = ("applicationResourcePointcut()"),
      returning = "returnValue")
  public void endpointAfterReturning(JoinPoint p, Object returnValue)  throws Throwable {
   
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    System.out.println("REQUEST PAYLOAD = "   mapper.writeValueAsString(p.getArgs()));
    System.out.println("METHOD NAME = "   p.getSignature().getName());
    System.out.println("RESPONSE OBJECT = "   mapper.writeValueAsString(returnValue));   
   
     //CAN NOT UNDERSTAND HOW TO CAPTURE HTTP VERB AND ENDPOINT HERE 
  }

}
  

Может ли кто-нибудь, пожалуйста, помочь здесь в захвате Http-глагола и конечной точки api?

Комментарии:

1. Трудно рассуждать о вашем вопросе (кроме как придумать более глобальное решение, подобное предложенному 4rpit), если вы не показываете свои целевые классы, а только аспект. Может быть, у них есть какая-то информация о запросе в полях или параметрах метода? Если это так, аспект может получить доступ к этой информации. Но мне нужно было бы сначала увидеть хотя бы один целевой класс, чтобы сообщить вам.

Ответ №1:

Вы должны получить объект запроса и можете получить из него требуемые значения

 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                    .getRequest();
  

и использовать методы, доступные в HttpServletRequest

 request.getParameterMap()
request.getMethod()
request.getRequestURL()
  

Комментарии:

1. Привет, @4rpit спасибо за ваш ответ. Могу ли я сделать это в аспекте, который я упомянул выше?

2. Без проблем, радость, да, вы можете это сделать.

3. Привет @ 4rpit, не могли бы вы показать, как мы делаем это внутри аспекта? Я не могу понять, как я могу получить доступ к запросу внутри аспекта?

4. Почему бы вам просто не попробовать? Как вы могли заметить, это вызов статического метода. Итак, в чем проблема?

5. Конечно, @kriegaex. Спасибо.