JerseyクライアントからJerseyサーバーにファイルを送信して戻す簡単なJerseyアプリケーションを作成しようとしています。ただし、ファイルはクライアントからサーバーへの途中でエンコードされているように見えますが、それ以外の方法ではエンコードされていないようです。私はこの行動をどう変えることができるのだろうか。Jerseyを使用して応答メッセージ本体のGZip圧縮を行う方法
私は単純な例でこれをテストしています:
public class GZipEncodingTest extends JerseyTest {
private static final String PATH = "/";
private static final String QUESTION = "foo", ANSWER = "bar";
private static final String ENCODING_GZIP = "gzip";
@Path(PATH)
public static class MyResource {
@POST
public Response handle(String question) throws IOException {
assertEquals(QUESTION, question);
return Response.ok(ANSWER).build(); // (1)
}
}
@Override
protected Application configure() {
enable(TestProperties.LOG_TRAFFIC);
enable(TestProperties.DUMP_ENTITY);
return new ResourceConfig(MyResource.class, GZipEncoder.class);
}
@Override
@SuppressWarnings("unchecked")
protected void configureClient(ClientConfig config) {
config.register(new EncodingFeature(ENCODING_GZIP, GZipEncoder.class));
}
@Test
public void testHeaders() throws Exception {
Response response = target().path(PATH).request().post(Entity.text(QUESTION));
assertEquals(ANSWER, response.readEntity(String.class));
}
}
ログインダンプから、私が意図したとおりに要求であると言うことができる:コンテンツのエンコーディングは、ヘッダでシグナリング要求メッセージ本体に適用されます。 Accept-Encodingも設定されています。サーバーは、適用されたgzip圧縮を理解し、要求メッセージ本文を解凍します。ただし、クライアントがgzipレスポンスを受け入れ、応答メッセージ本文を非圧縮形式で送信するという事実は無視されます。
私はResponse
-builderチェーンに(1)ラインでencoding(ENCODING_GZIP)
を追加すると、私は私が探しています結果を得ます。ただし、要求で許容可能とマークされている場合にのみエンコードを適用したいと思います。さらに、この機能は、特定のレスポンスだけでなく幅広く連携したいと考えています。
public class GZipWriterInterceptor implements WriterInterceptor { @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { context.getHeaders().add(HttpHeaders.CONTENT_ENCODING, ENCODING_GZIP); context.proceed(); } }
が、私は、これは、不必要なボイラープレートであることを確信しています: 私はもちろんWriterInterceptor
を使って手動で、このような機能を追加することができます。
EncodingFeature
は、クライアントライブラリの一部であるようです。私は基本的に、リクエストがaccept-encodingを使ってエンコードを提案したときに、Jerseyサーバーがgzipとしてデータをエンコードできるようにしたいと考えています。
ウェブ上でソリューションを検索しようとすると、十分に見つけられます。それらのほとんどはJersey 1に関するものです.GrizzlyServerにリスナーを追加することをお勧めします(JAX-RSではなくJersey固有のものでしょうか?)。私は上の人々ことがわかっ
org.glassfish.grizzly.http.GZipContentEncoding
org.glassfish.jersey.message.GZipEncoder
org.glassfish.grizzly.compression.zip.GZipEncoder
org.glassfish.grizzly.compression.zip.GZipDecoder
org.glassfish.grizzly.compression.zip.GZipFilter
:その後のGZIPエンコーディングを示唆ジャージー2依存関係ツリー内のたくさんのクラスがありますウェブはそれらのどれかを使ってあなたにもお勧めしますgh私はorg.glassfish.jersey
が実際のジャージーの依存関係であるので正しい選択と思われると思っています。関連するライブラリのApacheConnector
にあるものについては言及しません。私は実際にどちらを使うべきか分かりません。
http://stackoverflow.com/questions/19751014/gzip-encoding-in-jersey-2-grizzly –
私の問題は実際にはもう少し複雑です。私はgzipエンコーディングを再構築したかったのです。私はここで私の質問を再作成しました:http://stackoverflow.com/questions/19794014/why-does-jersey-swallow-my-content-encoding-header –
私はまだこの問題に*公式のソリューション*を再構築しようとしていますGZipの例を使用してください。しかし、私はそれだけではなく、他の方法で動作します。あなたが提案するソリューションは、正直言って私にハックのように見えます。 –