2012-09-21 17 views
7

में gzip संपीड़न सक्षम करें मैं अपने क्लाइंट का उपयोग gzip बनाने की कोशिश कर रहा हूं। मेरे पास सर्वर में 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 

यहाँ कोड है, जहां मैं ग्राहक बनाने है:: यह है कि ग्राहक यह सही हेडर नहीं भेज रहा है लगता है

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

हेडर कुछ नेटवर्क विश्लेषक से आया है, जैसे tcpmon? –

+0

मैं कनेक्शन को प्रॉक्सी करने के लिए ग्राइंडर का उपयोग कर रहा हूं और यातायात का डंप प्राप्त कर रहा हूं। –

उत्तर

15
:

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 एनोटेशन है

समाधान:

एक संशोधन के बाद, आपको यही चाहिए:

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

इसके बाद यह काम करता था।

+2

और जेएक्स-आरएस के लिए विश्वसनीय ग्राहक: 'क्लाइंट क्लाइंट = WebClient.client (पोर्ट); क्लाइंट कॉन्फ़िगरेशन कॉन्फ़िगरेशन = WebClient.getConfig (क्लाइंट); config.getInInterceptors()। जोड़ें (नया GZIPInInterceptor()); config.getOutInterceptors()।जोड़ें (नया GZIPOutInterceptor()); ' – Arad

+0

इससे मेरी समस्या हल हो गई। – Makky

0

मैं http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

से समझने के रूप में "GZIP बातचीत से वृद्धि है। यही कारण है कि, एक ग्राहक से एक शुरुआती अनुरोध gzipped नहीं किया जाएगा, लेकिन एक स्वीकार हेडर जोड़ दिया जाएगा और, अगर सर्वर जीजेआईपी संपीड़न का समर्थन करता है, प्रतिक्रिया gzipped और किसी भी बाद के अनुरोध भी होगा। "

जांचें कि क्या वेब सेवा Gzip स्वीकार करती है, और पहले अनुरोध के बाद केवल अनुरोधों की जांच करें।

+0

मुझे क्लाइंट को कॉन्फ़िगर करने की आवश्यकता है कि यह आपके द्वारा उल्लेख की गई बातचीत को ट्रिगर करने के लिए हेडर भेज देगा। लेकिन धन्यवाद! –

0

ऊपर उल्लेख जवाब

ग्राहक ग्राहक = ClientProxy.getClient (बंदरगाह) को और अधिक विस्तृत जवाब;

// इस लाइन के लिए

client.getOutInterceptors() सर्वर से संकुचित (gzip) अनुरोध भेजने जोड़ने (नई 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 स्वचालित रूप से "इंटरसेप्टर में" "बाहर इंटरसेप्टर" और "बाहर गलती इंटरसेप्टर" जोड़ देगा।

संबंधित मुद्दे