在CXF客户端中启用gzip压缩

我正在尝试让我的客户端使用gzip。 我在服务器中启用了GZipfunction。 似乎客户端没有发送正确的标头:

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 Annotation:

 @WebService @GZIP public interface IData .... 

解:

修改后,这就是您所需要的:

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

之后它起作用了。

当只有gzip来自服务器的响应而不是来自客户端的请求时,那么你需要添加标题和GZIPInInterceptor ,如下所示:

 // add accept-encoding header Map 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()); 

据我所知,来自http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

“GZIP是一个协商增强。也就是说,来自客户端的初始请求不会被gzip压缩,但会添加一个Accept标头,如果服务器支持GZIP压缩,则响应将被gzip压缩,任何后续请求也将被gzip压缩。 “

检查Web服务是否接受Gzip,并在第一次请求后仅检查请求。

启用gzip的最简单方法:

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

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

对上述答案的更详细解答

 Client client = ClientProxy.getClient(port); //this line to send compressed(gzip) request to server client.getOutInterceptors().add(new GZIPOutInterceptor()); //this in to uncompress server response at client side client.getInInterceptors().add(new GZIPInInterceptor());