2012-09-21 34 views
7

Tôi đang cố gắng để khách hàng của tôi sử dụng gzip. Tôi đã bật tính năng GZip trong máy chủ. Dường như khách hàng nó không gửi tiêu đề đúng:Bật tính năng nén gzip trong ứng dụng khách 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 

Dưới đây là đoạn code mà tôi tạo ra cho khách hàng:

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

Các idata cụ giao diện có Chú Gzip:

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

tiêu đề đến từ một số máy phân tích mạng, như tcpmon? –

+0

Tôi đang sử dụng Máy xay để ủy quyền kết nối và nhận một lưu lượng truy cập. –

Trả lời

15

Giải pháp:

Sau khi sửa đổi, đây là những gì bạn cần:

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

Sau đó nó hoạt động.

+2

Và đối với các máy khách REST của JAX-RS: 'Máy khách khách hàng = WebClient.client (cổng); ClientConfiguration config = WebClient.getConfig (máy khách); config.getInInterceptors(). Thêm (new GZIPInInterceptor()); config.getOutInterceptors().thêm (new GZIPOutInterceptor()); ' – Arad

+0

Điều này cũng giải quyết được vấn đề của tôi. – Makky

0

Theo tôi được biết từ http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

"GZIP là một tăng cường đàm phán. Đó là, một yêu cầu ban đầu từ một khách hàng sẽ không được giải nén bằng, nhưng một Chấp nhận tiêu đề sẽ được thêm vào, và nếu máy chủ hỗ trợ nén GZIP, phản hồi sẽ được gzipped và mọi yêu cầu tiếp theo cũng sẽ được thực hiện. "

Kiểm tra xem dịch vụ web có chấp nhận Gzip hay không và chỉ kiểm tra các yêu cầu sau yêu cầu đầu tiên.

+0

Điều tôi cần là định cấu hình ứng dụng khách sẽ gửi tiêu đề để kích hoạt thương lượng mà bạn đề cập. Nhưng cảm ơn! –

0

câu trả lời chi tiết hơn cho câu trả lời được đề cập ở trên

Client client = ClientProxy.getClient (port);

// dòng này để gửi nén (gzip) yêu cầu đến máy chủ

client.getOutInterceptors() thêm (GZIPOutInterceptor mới()).

// trong này để giải nén phản ứng máy chủ tại phía khách hàng

client.getInInterceptors() thêm (GZIPInInterceptor mới()).

+0

tại sao nó lại bị bỏ phiếu ..? cung cấp thêm làm rõ ..? – Santh

+0

có thể là định dạng sai – jmattheis

1

Khi chỉ gzip'in phản hồi từ máy chủ và không phải là yêu cầu từ khách hàng, sau đó bạn cần phải thêm tiêu đề và GZIPInInterceptor thích sau:

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

Cách dễ nhất để kích hoạt tính năng gzip :

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

GZipTính năng sẽ tự động thêm "trong chặn", "chặn đánh chặn" và "trình chặn lỗi ngoài".

Các vấn đề liên quan