Spring RestTemplate - как включить полную отладку / протоколирование запросов / ответов?

Я уже некоторое время использую 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 просто не работает (в некоторых случаях).

196
задан Community 23 May 2017 в 02:26
поделиться

2 ответа

---- июль 2019 ----

(с использованием Spring Boot)

Я был удивлен, что Spring Boot, со всей его магией нулевой конфигурации, не предоставляет простой способ проверять или регистрировать простое тело ответа JSON с RestTemplate. Я просмотрел различные ответы и комментарии, представленные здесь, и делюсь своей собственной дистиллированной версией того, что (все еще) работает, и мне кажется разумным решением, учитывая текущие параметры (я использую Spring Boot 2.1.6 с Gradle 4.4 )

1. Использование Fiddler в качестве http-прокси

Это на самом деле довольно элегантное решение, поскольку оно обходит все громоздкие усилия по созданию собственного перехватчика или замене базового http-клиента на apache (см. Ниже).

Установите и запустите Fiddler

, а затем

добавьте -DproxySet=true -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888 в параметры виртуальной машины

[+1121] 2. Использование Apache HttpClient

Добавьте 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.

3. Используйте Перехватчик

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

4. URL-адрес журнала и статус ответа без тела

Хотя это не соответствует заявленным требованиям регистрации тела, это быстрый и простой способ начать регистрацию ваших вызовов 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]
6
ответ дан 23 November 2019 в 05:16
поделиться

Для входа к [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"/>
2
ответ дан 23 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: