2012-09-21 8 views
7

Próbuję sprawić, aby mój klient używał gzip. Mam włączoną funkcję GZip na serwerze. Wydaje się, że klient nie jest wysłanie poprawnego nagłówka:Włącz kompresję gzip w kliencie CXF

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 

Oto kod gdzie utworzyć klienta:

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); 
    } 

implementuje interfejsu iData ma adnotacji GZip:

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

czy nagłówek pochodzi z analizatora sieci, np. Tcpmon? –

+0

Używam Grinder do proxy połączenia i uzyskać zrzut ruchu. –

Odpowiedz

15

Rozwiązanie:

Po nowelizacji to jest to, czego potrzebujesz:

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

Potem zadziałało.

+2

Dla klientów RESTful JAX-RS: 'Klient klienta = WebClient.client (port); ClientConfiguration config = WebClient.getConfig (klient); config.getInInterceptors(). Add (nowy GZIPInInterceptor()); config.getOutInterceptors().add (new GZIPOutInterceptor()); ' – Arad

+0

To również rozwiązało mój problem. – Makky

0

Jak rozumiem z http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

„GZIP jest negocjowane wzmocnienie. Oznacza to, że pierwotny wniosek z klienta nie zostaną skompresowane, ale Zebrane nagłówek zostanie dodany, a jeśli serwera obsługuje kompresję GZIP, odpowiedź zostanie skompresowana na gzip i będą również przekazywane kolejne żądania. "

Sprawdź, czy usługa internetowa akceptuje Gzip, i sprawdź tylko żądania po pierwszym żądaniu.

+0

To, czego potrzebuję, to skonfigurować klienta, który wyśle ​​nagłówek, aby wywołać negocjacje, o których wspomniałeś. Ale dzięki! –

0

bardziej szczegółową odpowiedź do powyższej odpowiedzi

Client client = ClientProxy.getClient (port);

// ta linia wysłać skompresowany (gzip) żądania do serwera

client.getOutInterceptors() dodać (nowa GZIPOutInterceptor()).;

// to w celu dekompresji odpowiedzi serwera po stronie klienta

client.getInInterceptors() dodać (nowa GZIPInInterceptor()).;

+0

dlaczego nie jest głosowany ..? pod warunkiem więcej wyjaśnień ..? – Santh

+0

może złe formatowanie – jmattheis

1

Kiedy tylko gzip'in odpowiedzi od serwera, a nie na żądanie od klienta, to trzeba dodać nagłówek i GZIPInInterceptor lubią następujący:

// 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

najprostszy sposób, aby umożliwić gzip :

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

GZipFeature automatycznie doda "w przechwytujących", "out przechwytujących" i "out przechwytywania błędów".