Bir Jersey istemcisinden bir Jersey sunucusuna ve geri dosya gönderen basit bir Jersey uygulaması yazmaya çalışıyorum. Ancak, dosyalar yalnızca istemciden sunucuya şifrelenmiş gibi görünür, ancak başka şekilde değil. Bu davranışı nasıl değiştirebileceğimi merak ediyorum.Jersey, yanıt iletisi gövdesi için GZip sıkıştırması kullanmasını nasıl sağlar
ben basit örnekte bu test ediyorum:
açmış dökümü itibarenpublic 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));
}
}
, ben istek amaçlanmaktadır olarak söyleyebilirim: İçerik kodlama başlığında işaret ve istek mesajı gövde üzerine uygulanır . Accept-Encoding da ayarlanır. Sunucu uygulanan gzip sıkıştırmasını anlar ve istek mesajının gövdesini açar. Bununla birlikte, istemcinin gzipli bir yanıtı kabul ettiği ve yanıt mesajı gövdesini sıkıştırılmamış olarak gönderdiği gerçeğini göz ardı eder.
Ben çizgi içinde encoding(ENCODING_GZIP)
ekleme
Response
-Builder zincirinde, ben arıyorum sonucu almak. Ancak, yalnızca istekte kabul edilebilir olarak işaretlenmişse kodlamayı uygulamak istiyorum. Dahası, bu özellik uygulamasına sadece belirli cevaplar için değil, aynı zamanda da çok geniş bir yelpazede başvurmak istiyorum.
Ben tabii ki WriterInterceptor
ile elle böyle bir özelliği ekleyebilirsiniz:
public class GZipWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
context.getHeaders().add(HttpHeaders.CONTENT_ENCODING, ENCODING_GZIP);
context.proceed();
}
}
ama bu gereksiz kazan plaka olduğuna inanıyorum.
EncodingFeature
yalnızca istemci kitaplığının bir parçası gibi görünüyor. Temel olarak, istekte bulunan kodlamayı kabul kodlama yoluyla önerdiğinde Jersey sunucusunun verileri gzip olarak kodlamasını sağlamak için bir olasılık arıyorum.
Web'de çözüm aramaya çalıştığımda bol miktarda buluyorum. Bunların çoğu Jersey 1 ile ilgilidir. Bazıları GrizzlyServer'a (Jersey'e özgü olan ve JAX-RS değil) bir dinleyici eklemeyi önerir. Ben insanlar bulundu
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
: Sonra GZip kodlamayı öneririz Jersey 2 bağımlılık ağacındaki bol sınıfları vardır web, hatta sizden herhangi birini kullanmanızı önerir gh org.glassfish.jersey
'un gerçek bir Jersey bağımlılığı olduğundan doğru seçim gibi gözüktüğünü düşünüyorum. ApacheConnector
ilgili kütüphanelerde bulunanlardan bahsetmemek. Hangisini kullanmam gerektiğini bilmiyorum.
Bkz. Http://stackoverflow.com/questions/19751014/gzip-encoding-in-jersey-2-grizzly –
Sorunum aslında biraz daha karmaşıktır. Gzip kodlamasını yeniden oluşturmak istedim. Soruyu burada yeniden düzenledim: http://stackoverflow.com/questions/19794014/why-does-jersey-swallow-my-content-encoding-header –
Hala bu sorunu çözerek * resmi çözümü * yeniden oluşturmaya çalışıyorum GZip örnek çalışması. Ancak, sadece bir şekilde çalışıyorum ama diğerini değil. Önerdiğiniz çözüm, bana karşı bir hack gibi görünüyor, dürüst olmak gerekirse. –