2012-09-21 174 views
7

我想让我的客户端使用gzip。我在服务器中启用了GZip功能。看来,客户端它不发送正确的标题:在CXF客户端启用gzip压缩

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 

下面的代码,我创建客户端:

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

的IData的接口实现对gzip译注:

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

头部是否来自某些网络分析器,如tcpmon? –

+0

我使用Grinder代理连接并获取流量转储。 –

回答

15

解决方案:

修改后,这是你需要的:

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

之后,它的工作。

+2

对于JAX-RS RESTful客户端: '客户端客户端= WebClient.client(端口); ClientConfiguration config = WebClient.getConfig(client); config.getInInterceptors()。add(new GZIPInInterceptor()); config.getOutInterceptors()。添加(新的GZIPOutInterceptor());' – Arad

+0

这也解决了我的问题。 – Makky

0

当我从http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

理解“GZIP是一个协商的提高。也就是说,从 客户的初始请求将不会被gzip压缩,而是一个接受头将被添加,如果 服务器支持GZIP压缩,响应将被压缩并且任何后续请求也将被完成。“

检查Web服务是否接受Gzip,并且只检查第一个请求后的请求。

+0

我需要的是配置客户端,它将发送头来触发您提到的协商。但是,谢谢! –

0

更详细的解答上述答案

客户端的客户端= ClientProxy.getClient(端口);

//这条线来发送压缩(gzip的)请求服务器

client.getOutInterceptors()添加(新GZIPOutInterceptor())。

//这在解压缩在客户机侧服务器响应

client.getInInterceptors()添加(新GZIPInInterceptor())。

+0

为什么它被拒绝投票..?提供了更多的澄清..? – Santh

+0

也许是格式不正确 – jmattheis

1

当只有gzip'in来自服务器的响应,而不是来自客户端的请求,那么你需要添加标题和GZIPInInterceptor喜欢到以下几点:

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

使用gzip的最简单方法:

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

GZipFeature会自动添加“在拦截器”,“出拦截”和“出故障拦截”。