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).
88
Jawaban:
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.
sumber
addFilter
metode tidak ada di Jersey 2.x. Bagaimana Anda menggunakan ini sekarang?Sejak Jersey 2.23 , ada yang
LoggingFeature
bisa Anda gunakan. Berikut ini adalah contoh yang sedikit disederhanakan, harap diperhatikan bahwa Anda juga dapat mendaftarkan fitur tersebutWebTarget
.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
mengatakan bahwa permintaan "dan / atau" responnya dicatat lol. Di komputer saya, keduanya dicatat.sumber
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
LoggingFilter
benar-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.sumber
LoggingFilter(Logger logger, boolean PrintEntity)
konstruktor, tetapi bahkan itu tidak mencetak cookie.LoggingFeature
tidak mencetak apa pun danLoggingFilter
tidak mencetak ... 🤷♂️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.All
dan8192
bisa jadinull
. Saya hanya menyediakannya di sini agar ringkas.sumber