Jak mogę zobaczyć rzeczywiste żądanie, które Jersey generuje i wysyła do serwera? Mam problemy z konkretnym żądaniem, a osoba obsługująca serwer internetowy poprosiła o wyświetlenie pełnego żądania (z nagłówkami i tym podobnymi).
88
Odpowiedzi:
Jeśli używasz tylko Jersey Client API, LoggingFilter (filtr klienta) powinien pomóc:
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);
W przeciwnym razie możesz ponownie rejestrować zarówno żądanie, jak i odpowiedź na serwerze przy użyciu innego LoggingFilter (filtru kontenera).
źródło
addFilter
metoda nie istnieje w Jersey 2.x. Jak teraz tego używasz?Od Jersey 2,23 , tam
LoggingFeature
można użyć. Poniższy przykład jest nieco uproszczony, pamiętaj, że możesz również zarejestrować tę funkcję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 of
LoggingFeature
mówi, że żądanie „i / lub” odpowiedź jest rejestrowane lol. Na moim komputerze oba są rejestrowane.źródło
Odpowiedź @ ivan.cikic dotyczy Jersey 1.x. Oto, jak to się robi w 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());
To nie ma znaczenia, ale po prostu mają na co narzekać: Nowa
LoggingFilter
jest naprawdę irytujące, ponieważ zmusza do korzystania Java Util Logging. Byłoby lepiej, gdyby dał mi kontrolę nad rejestratorem. Wygląda na krok wstecz w projektowaniu.źródło
LoggingFilter(Logger logger, boolean PrintEntity)
konstruktora, ale nawet to nie drukuje plików cookie.LoggingFeature
nic nie drukuje iLoggingFilter
drukuje ... 🤷♂️Wszystkie te odpowiedzi są dość zbliżone, ale brakuje im ustawienia do rejestrowania treści żądania i odpowiedzi. Przynajmniej w przypadku Jersey 2.30.1 rejestruję żądanie i odpowiedź, w tym ich odpowiednie organy:
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();
Technicznie rzecz biorąc, wartości
Level.All
i8192
mogą byćnull
. Podaję je tutaj, aby były zwięzłe.źródło