2012-09-21 17 views
7

Sto provando a far utilizzare al mio client gzip. Ho la funzione GZip abilitata nel server. Sembra che il cliente non è l'invio del corretto intestazione:Abilita compressione gzip nel client 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 

Ecco il codice in cui creo il cliente:

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

I implementa l'interfaccia iData ha l'annotazione GZip:

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

l'intestazione proviene da qualche analizzatore di rete, come tcpmon? –

+0

Sto utilizzando Grinder per eseguire il proxy della connessione e ottenere una copia del traffico. –

risposta

15

Soluzione:

Dopo una revisione, questo è quello che ti serve:

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

Dopo che ha funzionato.

+2

E per client RESTful JAX-RS: 'Client client = WebClient.client (porta); ClientConfiguration config = WebClient.getConfig (client); config.getInInterceptors(). Add (new GZIPInInterceptor()); config.getOutInterceptors().aggiungi (nuovo GZIPOutInterceptor()); ' – Arad

+0

Anche questo ha risolto il mio problema. – Makky

0

quanto ho capito dal http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

"GZIP è un miglioramento negoziata. Cioè, una richiesta iniziale da un client non sarà gzip, ma una Accetta verrà aggiunto intestazione e, se server supporta la compressione GZIP, la risposta sarà gzip e anche eventuali richieste successive. "

Verificare se il servizio Web accetta Gzip e controllare solo le richieste dopo la prima richiesta.

+0

Ciò di cui ho bisogno è stato configurare il client che invierà l'intestazione per attivare la negoziazione menzionata. Ma grazie! –

0

risposta più dettagliata alla risposta di cui sopra

client client = ClientProxy.getClient (porto);

// questa linea per inviare compressa richiesta (gzip) al server

client.getOutInterceptors() aggiungere (nuova GZIPOutInterceptor()).;

// questo per decomprimere risposta del server al lato client

client.getInInterceptors() aggiungere (nuova GZIPInInterceptor()).;

+0

perché è giù votato ..? fornito ulteriori chiarimenti ..? – Santh

+0

forse una cattiva formattazione – jmattheis

1

Quando solo gzip'in la risposta dal server e non la richiesta da parte del cliente, allora è necessario aggiungere l'intestazione e il GZIPInInterceptor come a seguire:

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

Il modo più semplice per consentire gzip :

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

GZipFeature aggiungerà automaticamente "in intercettore", "intercettore fuori" e "out colpa intercettore".