Spring - невозможно зарегистрировать тело запроса в пользовательском классе реализации ClientHttpRequestInterceptor - PullRequest
0 голосов
/ 20 марта 2019

Я создал имя класса как HttpInterceptor, которое реализует ClientHttpRequestInterceptor. Цель этого класса - перехватить вызовы resttemplate, а затем переопределить метод перехвата. Во время выполнения я не могу войти в тело запроса. Однако существует тело запроса, которое отправляется из внешнего интерфейса.

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

    String requestBody = "";
    String url = request.getURI().toString();

    ClientHttpResponse response = null;
    Date timeIn = new Date();
    String responseBody = "";

    // I have also try new String(body, "UTF-8") and many others.
    requestBody = new String(body, Charset.forName("UTF-8"));

    logger.info("=============================REQUEST BEGIN==============================================");
    logger.info("URI         :" + url);
    logger.info("Method      :" + request.getMethod());
    logger.info("Headers     :" + request.getHeaders());
    logger.info("Request body:" + requestBody);
    logger.info("=============================REQUEST END================================================");

    response = execution.execute(request, body);

    responseBody = StreamUtils.copyToString(response.getBody(), Charset.defaultCharset());
        //new String(ByteStreams.toByteArray(response.getBody()), Charset.forName("UTF-8"))

    logger.info("=============================RESPONSE BEGIN=============================================");
    logger.info("Status code  : " + response.getStatusCode());
    logger.info("Status text  : " + response.getStatusText());
    logger.info("Headers      : " + response.getHeaders());
    logger.info("Response body: " + responseBody);
    logger.info("=============================RESPONSE END===============================================");

    return response;
}

Шаблон остальных инициализируется так:

RestTemplate restTemplate = new RestTemplate(
                new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));

restTemplate.setInterceptors(Collections
            .singletonList(new HttpInterceptor()));

Я также нашел похожий вопрос о StackOverflow Почему мой пользовательский ClientHttpRequestInterceptor с пустым ответом , но это совершенно не то, что я хочу.

1 Ответ

0 голосов
/ 25 марта 2019

Это кажется очень интересным решением, но я не понял, насколько это возможно. Тот факт, что у меня возникли трудности с регистрацией тела запроса, но я нашел решение, в котором мне нужно построить законченное решение с одним изменением инициализации RestTemplate, а затем вернуться назад и снова построить решение, решило мою проблему. Ниже приведено изменение:

Постройте готовое решение без этой линии new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())

RestTemplate restTemplate = new RestTemplate();

restTemplate.setInterceptors(Collections
            .singletonList(new HttpInterceptor()));

Затем вернитесь к своим первым состояниям, как это, и затем создайте решение, исправившее мою проблему:

RestTemplate restTemplate = new RestTemplate(
                new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));

restTemplate.setInterceptors(Collections
            .singletonList(new HttpInterceptor()));

Примечание: Я проверил решение с разными входами (т. Е. Запрос), и оно работает правильно.

...