web-dev-qa-db-ja.com

Jersey:実際のリクエストを印刷します

Jerseyが生成してサーバーに送信する実際のリクエストを表示するにはどうすればよいですか?特定のリクエストに問題があり、ウェブサーバーを実行している仲間がリクエスト全体(ヘッダーなど)を確認するように要求しました。

83
Haphazard

Jerseyクライアント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 (コンテナーフィルター)を使用して、サーバー上の要求と応答の両方を再度ログに記録できます。

99
ivan.cikic

@ ivan.cikicの答えはJersey 1.xに対するものです。 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());

これは無関係ですが、私はただhaveと文句を言います:新しいLoggingFilterは、Java Util Logging。ロガーを制御できるようになれば、より良くなります。

49
Daniel Kaplan

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

LoggingFeatureのJavaDocは、リクエストの「および/または」応答がログに記録されることを示しています。私のマシンでは、両方が記録されます。

48