2012-09-21 177 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會自動添加「在攔截器」,「出攔截」和「出故障攔截」。