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


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.