Джерсі: Друк фактичного запиту


88

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


3
для реєстрації на стороні сервера в наступному записі: [Як отримати журнали джерсі на сервері?] [1] [1]: stackoverflow.com/questions/2332515 / ...
eeezyy

Відповіді:


100

Якщо ви просто використовуєте Jersey Client API, 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метод не існує в Джерсі 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

Починаючи з Джерсі 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. На моїй машині обидва реєструються.


Це чудово працює для Джерсі 2.25, але в 2.7, який я використовую, пакет "реєстрація" більше не знаходиться в 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
Я знаю, що це стара відповідь, але у мене є запитання - чи знаєте ви, як змусити реєстратора надрукувати ВСЮ інформацію, що міститься у запиті? Зокрема, печиво. Я використовував LoggingFilter(Logger logger, boolean PrintEntity)конструктор, але навіть це не друкує файли cookie.
bkaiser

2
LoggingFilter тепер застаріло. Ви повинні використати відповідь Мартіна на LoggingFeature. Це також підтримує перелік Verbosity для друку різної кількості деталей. Він повинен роздрукувати заголовки, які повинні містити файли cookie.
Ден Хардікер

Чомусь 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.