Jersey: Asıl isteği yazdırın


88

Jersey'nin oluşturduğu ve sunucuya gönderdiği gerçek talebi nasıl görebilirim? Belirli bir istekle ilgili sorunlar yaşıyorum ve web sunucusunu çalıştıran kişi tam isteği (başlıklar ve benzeri) görmek istedi.


3
sunucu tarafında oturum açmak için aşağıdaki
gönderiye

Yanıtlar:


100

Yalnızca Jersey Client API kullanıyorsanız, LoggingFilter (istemci filtresi) size şu konularda yardımcı olacaktır:

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

Aksi takdirde, diğer LoggingFilter (kapsayıcı filtresi) kullanarak sunucuda hem isteği hem de yanıtı yeniden günlüğe kaydedebilirsiniz .


5
Bu addFilteryöntem Jersey 2.x'te mevcut değildir. Bunu şimdi nasıl kullanıyorsun?
Daniel Kaplan

2
JAX-RS 2.x, Jersey 1.x tescilli istemci API'sine eşdeğer işlevsellik sağlar. Daha fazla ayrıntı: jersey.java.net/documentation/latest/…
ivan.cikic

Günlük çıktısını özelleştirmekle ilgilenen kişiler kendi LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d

55

Yana Jersey 2.23 , bir var LoggingFeaturesen kullanabilirsiniz. Aşağıdaki biraz basitleştirilmiş bir örnektir, lütfen özelliği de kaydedebileceğinizi unutmayın 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, istek "ve / veya" yanıtın lol günlüğe kaydedildiğini söylüyor. Benim makinemde her ikisi de günlüğe kaydedildi.


Bu Jersey 2.25 için harika çalışıyor, ancak benim kullandığım 2.7'de "günlük kaydı" paketi artık org.glassfish.jersey.core: jersey-common içinde yer almıyor. 2.7'de hangi pakete taşındığını biliyor musunuz?
Tim

Bu, isteğin veya yanıtın gövdesini yazdırmaz. Sadece başlıkları gösteriyor
David Brossard

2
@DavidBrossard Bunu kontrol etmek için yapıcı parametresi olarak org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY kullanın.
AxelW

51

@ ivan.cikic'in cevabı Jersey 1.x için. Jersey 2.x'de bunu şu şekilde yapabilirsiniz:

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

Bu alakasız ama şikayet etmeliyim : Yeni LoggingFiltergerçekten can sıkıcı çünkü sizi Java Util Logging kullanmaya zorluyor. Kaydediciyi kontrol etmeme izin verse daha iyi olur. Tasarımda geriye doğru bir adım gibi görünüyor.


3
Bunun eski bir cevap olduğunu biliyorum, ancak bir sorum var - kaydedicinin bir istekte bulunan TÜM bilgileri yazdırmasını nasıl sağlayacağınızı biliyor musunuz? Özellikle çerezler. Yapıcıyı kullandım LoggingFilter(Logger logger, boolean PrintEntity), ancak bu bile tanımlama bilgilerini yazdırmıyor.
bkaiser

2
LoggingFilter artık kullanımdan kaldırıldı. Martin'in LoggingFeature cevabını kullanmalısınız. Bu ayrıca, değişen miktarda ayrıntı yazdırmak için Ayrıntı numaralandırmasını da destekler. Çerezleri içermesi gereken başlıkları yazdırmalıdır.
Dan Hardiker

Bazı nedenlerden dolayı LoggingFeaturehiçbir şey yazdırmıyor ve LoggingFilteryazdırmıyor ... 🤷‍♂️
Ferran Maylinch

0

Tüm bu yanıtlar oldukça yakındır, ancak istek ve yanıt gövdesini günlüğe kaydetme ayarlarından yoksundurlar. En azından Jersey 2.30.1 ile ilgili kurumları da dahil olmak üzere talebi ve yanıtı günlüğe kaydetmeyi bu şekilde gerçekleştiriyorum:

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

Teknik olarak Level.Allve 8192değerleri olabilir null. Ben sadece kısa ve öz olmalarını sağlıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.