Джерси: распечатайте фактический запрос

88

Как я могу просмотреть фактический запрос, который Джерси генерирует и отправляет на сервер? У меня проблемы с конкретным запросом, и сотрудник, работающий с веб-сервером, попросил просмотреть полный запрос (с заголовками и т. Д.).

Случайный
источник
3
для ведения журнала на стороне сервера см. следующий пост: [Как получить журналы майки на сервере?] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

Ответы:

100

Если вы просто используете API-интерфейс Jersey Client, LoggingFilter (клиентский фильтр) должен вам помочь:

Client client = Client.create();
client.addFilter(new LoggingFilter(System.out));
WebResource webResource = client.resource("http://localhost:9998/");
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
                                         .get(ClientResponse.class);

В противном случае вы можете снова зарегистрировать и запрос, и ответ на сервере, используя другой LoggingFilter (контейнерный фильтр).

ivan.cikic
источник
5
Этот addFilterметод не существует в Jersey 2.x. Как вы это используете сейчас?
Дэниел Каплан,
2
JAX-RS 2.x предоставляет функциональные возможности, эквивалентные проприетарному клиентскому API Jersey 1.x. Более подробная информация: jersey.java.net/documentation/latest/…
ivan.cikic
Для людей, заинтересованных в настройке вывода журнала, они могут создать свой собственный LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d
55

Начиная с версии Jersey 2.23 , LoggingFeatureвы можете использовать. Ниже приведен немного упрощенный пример. Обратите внимание, что вы также можете зарегистрировать эту функцию WebTarget.

Logger logger = Logger.getLogger(getClass().getName());

Feature feature = new LoggingFeature(logger, Level.INFO, null, null);

Client client = ClientBuilder.newBuilder()
        .register(feature)
        .build();

Response response = client.target("https://www.google.com")
        .queryParam("q", "Hello, World!")
        .request().get();

JavaDoc LoggingFeatureговорит, что запрос "и / или" ответ регистрируется lol. На моей машине зарегистрированы оба.

Мартин Андерссон
источник
Это отлично работает для Jersey 2.25, но в 2.7, которую я использую, пакет «logging» больше не находится в org.glassfish.jersey.core: jersey-common. Вы знаете, в какой пакет он был перемещен в 2.7?
Тим
При этом не печатается тело запроса или ответа.
Дэвид Броссар
2
@DavidBrossard Используйте org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY в качестве параметра конструктора для управления этим.
AxelW
51

@ ivan.cikic отвечает для Джерси 1.x. Вот как это делается в Jersey 2.x:

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.filter.LoggingFilter;
import org.json.JSONException;
import org.json.JSONObject;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;

...

        ClientConfig config = new ClientConfig();

        Client client = ClientBuilder.newClient(config);
        client.register(new LoggingFilter());

Это не имеет значения, но я просто должен пожаловаться: новое LoggingFilterдействительно раздражает, потому что заставляет вас использовать Java Util Logging. Было бы лучше, если бы он давал мне контроль над регистратором. Похоже на шаг назад в дизайне.

Даниэль Каплан
источник
3
Я знаю, что это старый ответ, но у меня есть вопрос - знаете ли вы, как заставить регистратор печатать ВСЮ информацию, содержащуюся в запросе? В частности, файлы cookie. Я использовал LoggingFilter(Logger logger, boolean PrintEntity)конструктор, но даже он не печатает куки.
bkaiser
2
LoggingFilter теперь устарел. Вы должны использовать ответ Мартина на LoggingFeature. Это также поддерживает перечисление Verbosity для распечатки различного количества деталей. Он должен распечатать заголовки, которые должны включать файлы cookie.
Дэн Хардикер 03
Почему-то LoggingFeatureничего не печатает и LoggingFilterпечатает ... 🤷‍♂️
Ферран Мэйлинч
0

Все эти ответы довольно близки, но им не хватает настройки для регистрации тела запроса и ответа. По крайней мере, с Jersey 2.30.1 я выполняю протоколирование запроса и ответа, включая их соответствующие тела:

import javax.ws.rs.client.ClientBuilder;
import org.glassfish.jersey.logging.LoggingFeature;
import java.util.logging.Level;
import java.util.logging.Logger;

Logger logger = Logger.getLogger("LoggingFeature");
logger.setLevel(Level.ALL);
ClientBuilder.newClient()
  .target("https://www.example.com")
  .register(new LoggingFeature(
    logger,
    Level.ALL,
    LoggingFeature.Verbosity.PAYLOAD_ANY,
    8192))
  .request()
  .get();

С технической точки зрения Level.Allи 8192ценности могли быть null. Я просто привожу их здесь для краткости.

james.lorenzen
источник