Jersey: Cetak permintaan sebenarnya

88

Bagaimana saya bisa melihat permintaan sebenarnya yang dihasilkan dan dikirim Jersey ke server? Saya mengalami masalah dengan permintaan tertentu dan rekan yang menjalankan server web diminta untuk melihat permintaan lengkap (dengan header dan semacamnya).

Serampangan
sumber
3
untuk login di sisi server lihat posting berikut: [Bagaimana cara mendapatkan log jersey di server?] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

Jawaban:

100

Jika Anda hanya menggunakan Jersey Client API, LoggingFilter (filter klien) akan membantu Anda:

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

Jika tidak, Anda dapat membuat log lagi baik permintaan maupun respons di server menggunakan LoggingFilter (filter penampung) lainnya.

ivan.cikic
sumber
5
Ini addFiltermetode tidak ada di Jersey 2.x. Bagaimana Anda menggunakan ini sekarang?
Daniel Kaplan
2
JAX-RS 2.x menyediakan fungsionalitas yang setara dengan API klien milik Jersey 1.x. Detail lebih lanjut: jersey.java.net/documentation/latest/…
ivan.cikic
Bagi orang yang tertarik untuk menyesuaikan keluaran log, mereka dapat membuat LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d
55

Sejak Jersey 2.23 , ada yang LoggingFeaturebisa Anda gunakan. Berikut ini adalah contoh yang sedikit disederhanakan, harap diperhatikan bahwa Anda juga dapat mendaftarkan fitur tersebut 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 LoggingFeaturemengatakan bahwa permintaan "dan / atau" responnya dicatat lol. Di komputer saya, keduanya dicatat.

Martin Andersson
sumber
Ini berfungsi dengan baik untuk Jersey 2.25 tetapi di 2.7 yang saya gunakan, paket "logging" tidak lagi berada dalam org.glassfish.jersey.core: jersey-common. Apakah Anda tahu ke paket mana ia dipindahkan di 2.7?
Tim
Ini tidak mencetak isi permintaan atau tanggapan. Ini hanya menampilkan header
David Brossard
2
@DavidBrossard Gunakan org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY sebagai parameter konstruktor untuk mengontrol ini.
AxelW
51

Jawaban @ ivan.cikic adalah untuk Jersey 1.x. Inilah cara Anda melakukannya di 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());

Ini tidak relevan tetapi saya hanya perlu mengeluh: Yang baru LoggingFilterbenar-benar mengganggu karena memaksa Anda untuk menggunakan Java Util Logging. Akan lebih baik jika itu memberi saya kendali atas penebang. Tampak seperti langkah mundur dalam desain.

Daniel Kaplan
sumber
3
Saya tahu ini adalah jawaban lama, tetapi saya punya pertanyaan - apakah Anda tahu cara membuat logger mencetak SEMUA informasi yang terkandung dalam permintaan? Secara khusus, cookie. Saya telah menggunakan LoggingFilter(Logger logger, boolean PrintEntity)konstruktor, tetapi bahkan itu tidak mencetak cookie.
bkaiser
2
LoggingFilter sekarang tidak digunakan lagi. Anda harus menggunakan jawaban Martin dari LoggingFeature. Ini juga mendukung enum Verbositas untuk mencetak jumlah detail yang bervariasi. Ini harus mencetak header, yang harus menyertakan cookie.
Dan Hardiker
Untuk beberapa alasan LoggingFeaturetidak mencetak apa pun dan LoggingFiltertidak mencetak ... 🤷‍♂️
Ferran Maylinch
0

Semua jawaban ini cukup dekat tetapi tidak memiliki pengaturan untuk mencatat isi permintaan dan tanggapan. Setidaknya dengan Jersey 2.30.1 ini adalah cara saya menyelesaikan pencatatan permintaan dan tanggapan termasuk tubuh masing-masing:

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

Secara teknis nilai Level.Alldan 8192bisa jadi null. Saya hanya menyediakannya di sini agar ringkas.

james.lorenzen
sumber