Как мне зарегистрировать ответ в 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 запроса и тело ответа также в режиме отладки.