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


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 (контейнерный фильтр).


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. Я просто привожу их здесь для краткости.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.