Получить тело и заголовок запроса / ответа в Spring AOP - PullRequest
0 голосов
/ 28 мая 2020

Я хочу получить тело запроса / ответа и заголовок в моем аспекте до и после, если он доступен или как их получить.

Я имею в виду, что я думаю, что аннотация до должна работать для запроса,

с аннотацией после должен работать для ответа. Возможно ?

То, что я пробовал до сих пор:

Я пробовал библиотеку журналов, это очень сложно для меня, я не мог понять, как с этим работать. сдался.

Привод может делать трюки, но я делаю дополнительную работу, например, сколько раз конечные точки называли et c. Поэтому я не могу использовать привод.

Также я пробовал чтобы получить заголовки запросов, как показано ниже, по крайней мере, но я думаю, что эти заголовки все время будут одинаковыми. Я не мог получить httpservletresponse, как это делает httpservetrequest.

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

затем request.getHeader("date") но как насчет requestbody?

как получить requestbody? responsebody? repsonseheader?

Мой файл аспекта:

@Aspect
@Component
public class AppAspect implements ResponseInfo{

    @Before("execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))")
    public void loggingStartPointRequests(JoinPoint joinPoint) {

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

}

@After("execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))")
    public void loggingEndPointRequests(JoinPoint joinPoint) throws IOException {

    }

}

Мой класс контроллера:

@RestController
public class MainController {

    @GetMapping("/people") // 
    public ResponseEntity<Poeple> getAllPeople(@RequestParam(name = "page", required = false) Integer page,
            @RequestParam(name = "size", required = false) Integer size,
            @RequestParam(name = "sortBy", required = false) Boolean sortByNameOrEpCount) {
doSomething();
}

}

1 Ответ

0 голосов
/ 16 июля 2020

Я думаю, что вам нужно реализовать интерфейс HandlerInterceptor , это поможет вам проверить запрос и ответ. Например:

public class ApiMonitor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // when the client access to your endpoint
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    // when you finished your process 
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    // after you already returned an answer to the client
}
}

Если вы хотите работать с возвращаемым объектом непосредственно перед отправкой его клиенту, тогда вам понадобится АОП, да. Это пример того, как я это делаю, чтобы изменить объект на определенных конечных точках непосредственно перед его синтаксическим анализом до json.

@Component
@Aspect
public class MyCustomAOPInterceptor {

/**
* These poincuts check the execution of a method in any (*) 
* class of my.package.controller and that start with
* get/list/find plus any other word (*) . For example
* my.package.controller.UserController.getUserById()
*/
@Pointcut("execution(* my.package.controller.*.get*(..))")
public void petitionsStartWithGet() { }

@Pointcut("execution(* my.package.controller.*.list*(..))")
public void petitionsStartWithList() { }

@Pointcut("execution(* my.package.controller.*.find*(..))")
public void petitionsStartWithFind() { }

@AfterReturning(pointcut = "petitionsStartWithGet() || petitionsStartWithList() || petitionsStartWithFind()", returning = "result")
public void translateEntities(JoinPoint joinPoint, Object result) {
    // do your stuff; result is the object that you need
}

}
...