Как мне зарегистрировать ответ в Spring RestTemplate?

Я использую RestTemplate для звонков на веб-сервис.

String userId = restTemplate.getForObject(createUserUrl, String.class);

Если это не возвращает идентификатор пользователя, я просто получаю нулевое значение, но я не знаю почему. Как вывести фактический XML-ответ в журнал?

6 ответов

Решение

В зависимости от того, какой метод создания HTTP-соединения вы используете, вы можете посмотреть, как включить ведение журнала в реальных классах HTTP-соединений.

Например, если вы используете общие HttpClient, вы можете установить

log4j.logger.httpclient.wire=DEBUG

У проекта commons-httpclient есть целая страница в документации по их методам ведения журналов.

Сконфигурируйте свою регистрацию следующим образом:

log4j.logger.org.springframework.web.client=DEBUG

Затем используйте команду curl, чтобы увидеть результат, например:

curl  -H 'Accept: application/xml' -H 'Content-Type: application/xml' http://localhost:8080/ser/data

По умолчанию restTemplate использует HttpURlConnection (через SimpleClientHttpRequest), поэтому вам может потребоваться переключиться на jcarta httpclient, чтобы увидеть оператор журнала. В противном случае приведенная выше конфигурация журнала покажет вам ответ

    <bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory">
        <constructor-arg><bean  class="org.apache.commons.httpclient.HttpClient"/></constructor-arg>
    </bean>
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="httpClientFactory"/>
        <property name="messageConverters">
...

Вы можете использовать https://github.com/markhobson/spring-rest-template-logger для входа RestTemplate HTTP трафик.

Добавьте зависимость в ваш проект Maven:

<dependency>
    <groupId>org.hobsoft.spring</groupId>
    <artifactId>spring-rest-template-logger</artifactId>
    <version>2.0.0</version>
</dependency>

Затем настройте свой RestTemplate следующее:

RestTemplate restTemplate = new RestTemplateBuilder()
    .customizers(new LoggingCustomizer())
    .build()

Теперь весь HTTP-трафик RestTemplate будет регистрироваться в org.hobsoft.spring.resttemplatelogger.LoggingCustomizer на уровне отладки.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я написал эту библиотеку.

Если вы использовали swagger для создания клиента на основе RestTemplate, тогда в ApiClient есть общедоступный метод setDebugging, и вы можете установить значение true или false, и тогда я смог увидеть, что происходит. Надеюсь это поможет. Я использовал последний генератор swager cli, я думаю, что его 2.9 или что-то в этом роде

Для фабрики Apache HttpClient v4:

      final RestTemplate restTemplate = restTemplateBuilder
    .requestFactory(() -> new HttpComponentsClientHttpRequestFactory())
    .build();

библиотека Apache имеет:

      public class ManagedHttpClientConnectionFactory
...
    private final Log log = LogFactory.getLog(DefaultManagedHttpClientConnection.class);
    private final Log headerLog = LogFactory.getLog("org.apache.http.headers");
    private final Log wireLog = LogFactory.getLog("org.apache.http.wire");

Итак, определите регистраторовorg.apache.http.headers&org.apache.http.wireна уровне DEBUG!

Вам не нужно писать ни одной строки кода, вам просто нужно добавить следующее свойство в файл application.properties

logging.level.org.springframework.web.client.RestTemplate=DEBUG

используя это, он будет регистрировать тело запроса вызова шаблона остатка, заголовок запроса, URL запроса и тело ответа также в режиме отладки.

Другие вопросы по тегам