2012-09-21 3 views
7

Ich versuche, meinen Client gzip verwenden. Ich habe die GZip-Funktion auf dem Server aktiviert. Es scheint, dass der Kunde es nicht den richtigen Header gesendet:Aktivieren Sie die Gzip-Komprimierung in CXF-Client

POST /api/v1/data HTTP/1.1 
Content-Type: text/xml; charset=UTF-8 
Accept: */* 
SOAPAction: "" 
User-Agent: Apache CXF 2.6.2 
Cache-Control: no-cache 
Pragma: no-cache 
Host: localhost:8001 
Connection: keep-alive 
Content-Length: 539 

Hier ist der Code, wo ich den Client zu erstellen:

private static final QName SERVICE_NAME = new QName(
      "http://xxx/", "IData"); 
    private static final QName PORT_NAME = new QName(
      "http://xxx/", "IDataPort"); 
    IData port; 

    public void initPort() { 
     Service service = Service.create(SERVICE_NAME); 
     // Endpoint Address 
     String endpointAddress = ClientUtil.getUrl() 
       + "data"; 

     // Add a port to the Service 
     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, 
       endpointAddress); 

     port = service.getPort(IData.class); 
    } 

Die IData Schnittstelle implementiert hat die GZIP Annotation:

@WebService 
@GZIP 
public interface IData .... 
+0

stammt die Kopfzeile von einem Netzwerkanalysator, wie tcpmon? –

+0

Ich verwende Grinder, um die Verbindung zu Proxy-Server herzustellen und einen Datenverkehr zu generieren. –

Antwort

15

Lösung:

Nach einer Revision, das ist, was Sie brauchen:

Client client = ClientProxy.getClient(port); 
client.getInInterceptors().add(new GZIPInInterceptor()); 
client.getOutInterceptors().add(new GZIPOutInterceptor()); 

Danach hat es funktioniert.

+2

Und für JAX-RS RESTful-Clients: 'Client-Client = WebClient.client (Port); ClientConfiguration config = WebClient.getConfig (Client); config.getInInterceptors(). Add (neuer GZIPInInterceptor()); config.getOutInterceptors().add (new GZIPOutInterceptor()); ' – Arad

+0

Dies löste auch mein Problem. – Makky

0

Wie ich aus http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

„GZIP verstehen, ist eine Verhandlungs Verbesserung. Das heißt, eine erste Anforderung von einem Client nicht gzipped werden, aber ein Accept-Header hinzugefügt und wird, wenn der Server unterstützt GZIP-Komprimierung, die Antwort wird gezippt und alle nachfolgenden Anfragen werden auch. "

Überprüfen Sie, ob der Webdienst Gzip akzeptiert, und prüfen Sie nur Anfragen nach der ersten Anfrage.

+0

Was ich brauchte, war, den Client zu konfigurieren, dass es den Header senden wird, um die Verhandlung, die Sie erwähnen, auszulösen. Aber danke! –

0

ausführlichere Antwort auf die oben erwähnte Antwort

Client-client = ClientProxy.getClient (port);

// diese Zeile komprimiert senden (gzip) Anforderung an den Server

client.getOutInterceptors() hinzufügen (neu GZIPOutInterceptor()).

// dies auf Server-Antwort auf Client-Seite

client.getInInterceptors() zu dekomprimieren hinzufügen (neu GZIPInInterceptor()).

+0

warum ist es gewählt ..? lieferte mehr Klärung ..? – Santh

+0

vielleicht schlechte Formatierung – jmattheis

1

Wenn nur gzip'in die Antwort vom Server und nicht die die Anforderung von dem Client, dann müssen Sie den Header und die GZIPInInterceptor wie zu folgenden hinzuzufügen:

// add accept-encoding header 
Map<String, Object> requestHeaders = new HashMap<>(); 
requestHeaders.put("Accept-Encoding", new ArrayList<>(Arrays.asList("gzip"))); 
((BindingProvider)service).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders); 

// encode response from server 
client.getInInterceptors().add(new GZIPInInterceptor()); 
0

Der einfachste Weg, gzip zu ermöglichen :

List<Feature> features = Arrays.asList(new GZIPFeature()) 
final WebClient webClient = WebClient.create(uri, null, features, null); 

GZipFeature automatisch hinzufügen "in Interceptor", "out-Interceptor" und "out Fehler Interceptor".

Verwandte Themen