Jersey: Drucken Sie die aktuelle Anfrage

88

Wie kann ich die tatsächliche Anforderung anzeigen, die Jersey generiert und an den Server sendet? Ich habe Probleme mit einer bestimmten Anfrage und der Mitarbeiter, der den Webserver betreibt, hat darum gebeten, die vollständige Anfrage (mit Headern und dergleichen) anzuzeigen.

Planlos
quelle
3
Informationen zur Protokollierung auf der Serverseite finden Sie im folgenden Beitrag: [Wie bekomme ich
Trikotprotokolle

Antworten:

100

Wenn Sie nur die Jersey Client API verwenden, sollte LoggingFilter ( Clientfilter ) Ihnen helfen:

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);

Andernfalls können Sie die Anforderung und die Antwort auf dem Server erneut mit einem anderen LoggingFilter (Containerfilter) protokollieren .

ivan.cikic
quelle
5
Diese addFilterMethode gibt es in Jersey 2.x nicht. Wie benutzt du das jetzt?
Daniel Kaplan
2
JAX-RS 2.x bietet Funktionen, die der proprietären Client-API von Jersey 1.x entsprechen. Weitere Details: jersey.java.net/documentation/latest/…
ivan.cikic
Für Personen, die an der Anpassung der Protokollausgabe interessiert sind, können sie ihren eigenen LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d
55

Seit Jersey 2.23 gibt es eine, die LoggingFeatureSie verwenden können. Das folgende Beispiel ist etwas vereinfacht. Bitte beachten Sie, dass Sie die Funktion auch registrieren können 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 von LoggingFeaturesagt, dass die Anfrage "und / oder" die Antwort protokolliert wird lol. Auf meinem Computer sind beide protokolliert.

Martin Andersson
quelle
Dies funktioniert gut für Jersey 2.25, aber in 2.7, das ich verwende, befindet sich das "Protokollierungs" -Paket nicht mehr in org.glassfish.jersey.core: jersey-common. Wissen Sie, in welches Paket es in 2.7 verschoben wurde?
Tim
Dadurch wird der Hauptteil der Anforderung oder Antwort nicht gedruckt. Es zeigt nur die Überschriften
David Brossard
2
@DavidBrossard Verwenden Sie org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY als Konstruktorparameter, um dies zu steuern.
AxelW
51

@ ivan.cikic antwortet für Jersey 1.x. So geht's in 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());

Das ist irrelevant, aber ich muss mich nur beschweren: Das Neue LoggingFilterist wirklich ärgerlich, weil es Sie zwingt, Java Util Logging zu verwenden. Es wäre besser, wenn ich die Kontrolle über den Logger hätte. Scheint ein Rückschritt im Design zu sein.

Daniel Kaplan
quelle
3
Ich weiß, dass dies eine alte Antwort ist, aber ich habe eine Frage: Wissen Sie, wie Sie den Logger dazu bringen können, ALLE in einer Anfrage enthaltenen Informationen zu drucken? Insbesondere Cookies. Ich habe den LoggingFilter(Logger logger, boolean PrintEntity)Konstruktor verwendet, aber selbst das druckt keine Cookies.
Bkaiser
2
LoggingFilter ist jetzt veraltet. Sie sollten Martins Antwort auf das LoggingFeature verwenden. Dies unterstützt auch die Ausführlichkeitsaufzählung, um eine unterschiedliche Menge an Details auszudrucken. Es sollte Header ausdrucken, die Cookies enthalten sollten.
Dan Hardiker
Aus irgendeinem Grund LoggingFeaturedruckt nichts und LoggingFilterdruckt ... 🤷‍♂️
Ferran Maylinch
0

Alle diese Antworten sind ziemlich nah beieinander, aber es fehlt die Einstellung, um den Anforderungs- und Antworttext zu protokollieren. Zumindest mit Jersey 2.30.1 kann ich auf diese Weise die Anforderung und Antwort einschließlich ihrer jeweiligen Körper protokollieren:

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();

Technisch könnten die Level.Allund 8192Werte sein null. Ich stelle sie hier nur zur Verfügung, um sie kurz zu fassen.

james.lorenzen
quelle