Jerseyが生成してサーバーに送信する実際のリクエストを表示するにはどうすればよいですか?特定のリクエストで問題が発生し、ウェブサーバーを実行している仲間がリクエスト全体(ヘッダーなどを含む)を表示するように要求しました。
回答:
Jersey Client APIを使用しているだけの場合は、LoggingFilter(クライアントフィルター)が役立ちます。
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);
それ以外の場合は、他のLoggingFilter(コンテナーフィルター)を使用して、サーバーに要求と応答の両方を再度ログに記録できます。
addFilter
メソッドはJersey2.xには存在しません。これを今どのように使用していますか?
ジャージー2.23以降、LoggingFeature
使用できるものがあります。以下は少し簡略化された例ですが、機能を登録することもできることに注意してください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
、リクエスト「および/または」レスポンスがログに記録されると言っています。私のマシンでは、両方がログに記録されます。
@ ivan.cikicの答えはJersey1.xに対するものです。Jersey2.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());
これは無関係ですが、私はちょうど持って文句を言うために:新しいがLoggingFilter
、それは、Java Utilのロギングを使用するためにあなたを強制するために本当に迷惑です。それが私にロガーの制御を与えてくれればもっと良いでしょう。デザインが一歩後退したようです。
LoggingFilter(Logger logger, boolean PrintEntity)
コンストラクターを使用しましたが、それでもCookieは出力されません。
LoggingFeature
何かを印刷していませんLoggingFilter
...🤷♂️印刷を行います
これらの回答はすべてかなり近いですが、要求と応答の本文をログに記録する設定がありません。少なくともJersey2.30.1では、これが、それぞれの本文を含む要求と応答のログ記録を実現する方法です。
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();
技術的には、Level.All
andの8192
値はnull
。簡潔にするために、ここでそれらを提供します。