2012-09-21 17 views
7

Estoy tratando de hacer que mi cliente use gzip. Tengo la característica GZip habilitada en el servidor. Parece que el cliente no es el envío de la cabecera correcta:Habilitar la compresión gzip en el cliente 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 

Aquí está el código en la que se crea el 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); 
    } 

Los implementa la interfaz iData tiene la anotación GZip:

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

¿El encabezado proviene de algún analizador de red, como tcpmon? –

+0

Estoy usando Grinder para realizar un proxy de la conexión y obtener un volcado del tráfico. –

Respuesta

15

Solución:

Después de una revisión, esto es lo que necesita:

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

Después de eso funcionó.

+2

Y para clientes RESTful de JAX-RS: 'Client client = WebClient.client (port); ClientConfiguration config = WebClient.getConfig (cliente); config.getInInterceptors(). Add (nuevo GZIPInInterceptor()); config.getOutInterceptors().add (nuevo GZIPOutInterceptor()); ' – Arad

+0

Esto también resolvió mi problema. – Makky

0

Según entiendo de http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

"GZIP es una mejora negociado. Es decir, una solicitud inicial de un cliente no será gzipped, sino una acepte se añadió cabecera y, si el servidor admite la compresión GZIP, la respuesta se descomprimirá y las solicitudes posteriores también lo serán ".

Compruebe si el servicio web acepta Gzip, y verifique solo las solicitudes después de la primera solicitud.

+0

Lo que necesito es configurar el cliente que enviará el encabezado para activar la negociación que mencionas. ¡Pero gracias! –

0

respuesta más detallada a la respuesta mencionado anteriormente

Cliente cliente = ClientProxy.getClient (puerto);

// esta línea para enviar solicitud comprimido (gzip) al servidor

client.getOutInterceptors add() (nueva GZIPOutInterceptor()).;

// esto en descomprimir la respuesta del servidor en el lado del cliente

client.getInInterceptors() añadir (nueva GZIPInInterceptor()).;

+0

por qué está abajo votado ...? proporcionó más aclaraciones ...? – Santh

+0

tal vez mal formateo – jmattheis

1

Cuando sólo gzip'in la respuesta del servidor y no a la petición del cliente, entonces es necesario agregar el encabezado y el GZIPInInterceptor como a continuación:

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

La forma más fácil para que gzip :

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

GZipFeature añadirá automáticamente "en el interceptor", "interceptor fuera" y "fuera del interceptor culpa".

Cuestiones relacionadas