24

क्या पुस्तकालय अपाचे कॉमन्स HttpClient समर्थन Gzip है? हम क्लाइंट/सर्वर संचार को तेज करने के लिए हमारे अपाचे सर्वर पर सक्षम gzip संपीड़न का उपयोग करना चाहते थे (हमारे पास एक PHP पृष्ठ है जो हमारे एंड्रॉइड एप्लिकेशन को सर्वर के साथ फ़ाइलों को सिंक करने की अनुमति देता है)।क्या Apache Commons HttpClient समर्थन GZIP है?

उत्तर

23

अपाचे एचटीपी क्लाइंट 4.1 बॉक्स के बाहर सामग्री संपीड़न को कई अन्य सुविधाओं के साथ समर्थन देता है जिन्हें पहले स्कोप से बाहर माना जाता था।

+44

मैं इसे बॉक्स से कैसे निकालूं? – djechlin

+0

4.5.3 में, केवल क्लाइंट का उपयोग HttpClientBuilder.create()। Build() द्वारा करें, और यह आपके लिए सभी gzip अनुरोध और प्रतिक्रिया विकृति को संभालेगा। –

7

इस आउट ऑफ़ द बॉक्स के लिए इसका कोई समर्थन नहीं है, और ऐसा लगता है कि यह HttpClient 3.x में जोड़ा जाने की संभावना नहीं है (बल्कि जिची मुद्दे here देखें)। हालांकि, आप कस्टम लाइब्रेरी के शीर्ष पर स्तरित कस्टम अनुरोध पाठकों और मैन्युअल अनुरोध/प्रतिक्रिया स्ट्रीम हैंडलिंग जोड़कर ऐसा कर सकते हैं, लेकिन यह स्पष्ट रूप से है।

ऐसा लगता है कि आप इसे HttpClient 4 के साथ कर सकते हैं, लेकिन कुछ प्रयास किए बिना नहीं।

सुंदर शर्मीली, अगर आप मुझसे पूछें, तो यह सामान वास्तव में उससे आसान होना चाहिए।

+5

मनोरंजक पढ़ने – karim79

+1

@ karim79 के +1: मैं किसी भी आशा व्यक्त की कि HttpClient वास्तविकता पर एक पकड़ के साथ किसी के द्वारा बनाए रखा जा रहा है त्याग दिया है (के रूप में HttpClient 4 एपीआई पर्याप्त सबूत नहीं किया गया हो) । – skaffman

+0

@ स्काफमैन जावा में उपयोग करने के लिए कुछ बेहतर है? – djechlin

17

तो अपने सर्वर Gzipped सामग्री उपलब्ध कराने के, Apache HTTP ग्राहक 4.1 के साथ सक्षम है आप सभी की जरूरत

org.apache.http.impl.client.ContentEncodingHttpClient 

जो DefaultHttpClient का एक उपवर्ग है उपयोग करने के लिए है।

यह क्लाइंट हेडर को यह भी कहेंगे कि यह GZIPped सामग्री स्वीकार करता है।

+0

यह मेरे लिए सही काम करता है, धन्यवाद –

+13

एचटीपी क्लाइंट 4.2.1 में, 'ContentEncodingHttpClient' को बहिष्कृत किया गया है; उपयोगकर्ताओं को DecompressingHttpClient का उपयोग करने के लिए प्रोत्साहित किया जाता है, http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DecompressingHttpClient.html – Hbf

+2

@Hbf को भी बहिष्कृत किया गया है। – djechlin

0

Custom Protocol Interceptors भी मदद कर सकता है।

अस्वीकरण: मैंने अभी तक यह कोशिश नहीं की है।

0

यह बॉक्स से बाहर का समर्थन नहीं करता, लेकिन आप

val entity = new GzipDecompressingEntity(response.getEntity) 

बुला तो हमेशा की तरह entity.getContent के साथ आगे बढ़ना द्वारा असम्पीडित एक में लौटे HttpResponse की इकाई बदल सकता है।

1

यहाँ है, जो जावा अपाचे-http-क्लाइंट लाइब्रेरी

def createCloseableHttpClient(): CloseableHttpClient = { 
    val builder: HttpClientBuilder = HttpClientBuilder.create 
    val closableClient = builder.build() 
    closableClient 
    } 

    def postData(data: String): Unit = { 
    val entity = EntityBuilder.create() 
     .setText(data) 
     .setContentType(ContentType.TEXT_PLAIN) 
     .gzipCompress() 
     .build() 
    val post = new HttpPost(postURL + endPoint) 
    post.setEntity(entity) 
    post.setHeader("Content-Type", "application/gzip") 
    val client = createCloseableHttpClient() 
    client.execute(post) 
    client.close() 
    } 
1

का उपयोग करता है 4.1 के बाद से नमूना स्केला कोड है अपाचे HttpClients अनुरोध और प्रतिक्रिया संपीड़न संभालती है। आपको अनुरोध को संपीड़ित करने की आवश्यकता नहीं है। अनुरोध शीर्षलेख & में किसी भी "स्वीकृति-एन्कोडिंग" को सेट करने की आवश्यकता नहीं है डिकंप्रेशन को संभालने की कोई आवश्यकता नहीं है। 4.3 तक यह gzip और deflate संभाल सकता है। आप ResponseContentEncoding एपीआई डॉक here देख सकते हैं।

बस का उपयोग करें:

HttpClients.custom() 

जो उपयोग करता है:

HttpClientBuilder.create() 

आप पुस्तकालय गोटो में जाँच करना चाहते हैं HttpClientBuilder इसे इस्तेमाल करता है RequestAcceptEncoding & ResponseContentEncoding

आप "disableContentCompression के माध्यम से अक्षम कर सकते हैं () "

HttpClient httpClient = HttpClients.custom() 
       .setConnectionManager(cm) 
       .disableContentCompression() //this disables compression 
       .build(); 

कृपया सुनिश्चित करें कि यदि आप कोई इंटरसेप्टर जोड़ते हैं तो यह इसे ओवरराइड कर सकता है, इसे सावधानीपूर्वक उपयोग करें।(!)

HttpClient httpClient = HttpClients.custom() 
       .setConnectionManager(cm) 
       .setHttpProcessor(httpprocessor) //this interceptor can override your compression. 
       .build(); 
संबंधित मुद्दे