Я уже некоторое время использую Spring RestTemplate и постоянно наталкиваюсь на стену, когда пытаюсь отладить его запросы и ответы. В основном я хочу увидеть то же самое, что и при использовании curl с включенной опцией «verbose». Например:
curl -v http://twitter.com/statuses/public_timeline.rss
Будет отображать как отправленные, так и полученные данные (включая заголовки, файлы cookie и т. Д.).
Я проверил несколько связанных сообщений, например: Как мне записать ответ в Spring RestTemplate? , но мне не удалось решить эту проблему.
Один из способов сделать это - фактически изменить исходный код RestTemplate и добавить туда несколько дополнительных операторов регистрации, но я считаю, что этот подход действительно является крайней мерой. Должен быть какой-то способ указать Spring Web Client / RestTemplate регистрировать все более удобным способом.
Моя цель - сделать это с помощью кода вроде:
restTemplate.put("http://someurl", objectToPut, urlPathValues);
, а затем получить такую же отладочную информацию (как я получаю с помощью curl) в файле журнала или в консоли. {{1} } Я считаю, что это было бы чрезвычайно полезно для всех, кто использует Spring RestTemplate и имеет проблемы. Использование curl для отладки проблем с RestTemplate просто не работает (в некоторых случаях).
Я был удивлен, что Spring Boot, со всей его магией нулевой конфигурации, не предоставляет простой способ проверять или регистрировать простое тело ответа JSON с RestTemplate. Я просмотрел различные ответы и комментарии, представленные здесь, и делюсь своей собственной дистиллированной версией того, что (все еще) работает, и мне кажется разумным решением, учитывая текущие параметры (я использую Spring Boot 2.1.6 с Gradle 4.4 )
Это на самом деле довольно элегантное решение, поскольку оно обходит все громоздкие усилия по созданию собственного перехватчика или замене базового http-клиента на apache (см. Ниже).
Установите и запустите Fiddler
, а затем
[+1121] 2. Использование Apache HttpClientдобавьте
-DproxySet=true -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888
в параметры виртуальной машины
Добавьте Apache HttpClient в зависимости от Maven или Gradle.
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
Используйте HttpComponentsClientHttpRequestFactory
как RequestFactory для RestTemplate. Простейший способ сделать это будет:
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
Включить DEBUG в вашем файле application.properties
(если вы Вы используете Spring Boot)
logging.level.org.apache.http=DEBUG
Если вы используете Spring Boot, вам нужно убедиться, что у вас настроена среда ведения журналов, например с помощью зависимости пружина-загрузчик-стартер, которая включает в себя spring-boot-starter-logging
.
Я не рекомендую это. Я позволю вам прочитать предложения, встречные предложения и ошибки в других ответах и комментариях и решить для себя, хотите ли вы пойти по этому пути.
Хотя это не соответствует заявленным требованиям регистрации тела, это быстрый и простой способ начать регистрацию ваших вызовов REST. Он отображает полный URL-адрес и статус ответа.
Просто добавьте следующую строку в ваш файл application.properties
(при условии, что вы используете Spring Boot, и если вы используете зависимость запуска пружинной загрузки, включающую spring-boot-starter-logging
)
logging. level.org.springframework.web.client.RestTemplate = DEBUG
Вывод будет выглядеть примерно так:
2019-07-29 11:53:50.265 DEBUG o.s.web.client.RestTemplate : HTTP GET http://www.myrestservice.com/Endpoint?myQueryParam=myValue
2019-07-29 11:53:50.276 DEBUG o.s.web.client.RestTemplate : Accept=[application/json]
2019-07-29 11:53:50.584 DEBUG o.s.web.client.RestTemplate : Response 200 OK
2019-07-29 11:53:50.585 DEBUG o.s.web.client.RestTemplate : Reading to [org.mynamespace.MyJsonModelClass]
Для входа к [1 110] Logback со справкой от Apache HttpClient:
Вам нужен Apache HttpClient в пути к классу:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
Настраивают Ваш RestTemplate
для использования HttpClient:
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
Для входа запросов и ответов добавьте к конфигурационному файлу Logback:
<logger name="org.apache.http.wire" level="DEBUG"/>
Или зарегистрироваться еще больше:
<logger name="org.apache.http" level="DEBUG"/>