Ich versuche, eine einfache Jersey-Anwendung zu schreiben, die Dateien von einem Jersey-Client zu einem Jersey-Server und zurück sendet. Die Dateien scheinen jedoch nur auf dem Weg vom Client zum Server kodiert zu sein, aber nicht umgekehrt. Ich frage mich, wie ich dieses Verhalten ändern kann.Wie man Jersey verwendet GZip Kompression für die Antwort Nachricht Körper
Ich prüfe dies in einem einfachen Beispiel:
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));
}
}
Vom angemeldet dump, kann ich sagen, dass die Anforderung, wie beabsichtigt: die Inhaltscodierung wird in der Kopfzeile und angewendet auf die Anforderungsnachricht Körper signalisiert . Das Accept-Encoding wird ebenfalls festgelegt. Der Server versteht die angewendete gzip-Komprimierung und entpackt den Nachrichtentext der Anfrage. Es ignoriert jedoch die Tatsache, dass der Client eine gezippte Antwort akzeptiert und den Antwortnachrichtentext unkomprimiert sendet.
Als ich encoding(ENCODING_GZIP)
in Zeile (1) in der Response
-builder Kette anhängen, erhalte ich das Ergebnis die ich suche. Ich möchte jedoch nur die Codierung anwenden, wenn sie in der Anfrage als akzeptabel markiert wurde. Darüber hinaus möchte ich diese Feature-Anwendung breit und nicht nur für spezifische Antworten verbünden.
Ich kann natürlich hinzufügen, ein solches Feature manuell mit einem WriterInterceptor
:
public class GZipWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
context.getHeaders().add(HttpHeaders.CONTENT_ENCODING, ENCODING_GZIP);
context.proceed();
}
}
aber ich bin überzeugt, dass dies nicht notwendig Kesselblech.
Die EncodingFeature
scheint nur ein Teil der Client-Bibliothek zu sein. Ich bin grundsätzlich auf der Suche nach einer Möglichkeit, den Jersey-Server Daten als gzip codieren, wenn die Anfrage die Codierung über Akzeptieren-Codierung vorgeschlagen.
Wenn ich versuche, nach Lösungen im Internet zu suchen, finde ich reichlich. Die meisten von ihnen betreffen Jersey 1. Einige von ihnen schlagen vor, dem GrizzlyServer einen Listener hinzuzufügen (was Jersey-spezifisch wäre und nicht JAX-RS?). Dann gibt es viele Klassen innerhalb der Jersey 2 Abhängigkeitsbaum, die GZIP-Kodierung vorschlagen:
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
ich, dass die Menschen gefunden auf das Netz schlägt vor, irgendwelche von ihnen sogar zu verwenden Ich denke, dass org.glassfish.jersey
scheint die richtige Wahl zu sein, da es eine tatsächliche Jersey-Abhängigkeit ist. Ganz zu schweigen von denen, die in den ApacheConnector
verwandten Bibliotheken zu finden sind. Ich habe keine Ahnung, welchen ich eigentlich benutzen sollte.
Siehe http://stackoverflow.com/questions/19751014/gzip-encoding-in-jersey-2-grizzly –
Nun, mein Problem ist eigentlich ein wenig komplexer. Ich wollte die gzip-Codierung neu erstellen. Ich habe meine Frage hier wiederholt: http://stackoverflow.com/questions/19794014/why-does-jersey-swallow-my-content-encoding-header –
Ich versuche immer noch, die * offizielle Lösung * zu diesem Problem wieder aufzubauen, indem ich bekomme Das GZip-Beispiel funktioniert. Aber ich arbeite nur in einer Richtung, aber nicht in der anderen. Die Lösung, die Sie vorschlagen, sieht für mich wie ein Hack aus, um ehrlich zu sein. –