2009-11-04 3 views
5

में HTTP प्रतिक्रिया का आकार प्राप्त करें मैं जानना चाहता हूं कि किसी निश्चित http-request के जवाब में कितना डेटा भेजा गया था। यह क्या मैं वर्तमान में करते हैं:जावा

HttpURLConnection con = (HttpURLConnection) feedurl.openConnection(); 

//) सामग्री आकार पूर्णांक feedsize = con.getContentLength के लिए प्रतिक्रिया (जाँच;

समस्या यह है कि सामग्री-legnth हमेशा सेट नहीं है। जैसे जब सर्वर ट्रांसफर-एन्कोडिंग = खंडित होता है तो मुझे 1 का मान वापस मिलता है।

मैं प्रगति जानकारी प्रदर्शित करने के लिए इसकी आवश्यकता नहीं है। मुझे बस उस डेटा के आकार को जानने की जरूरत है जो इसे करने के बाद मुझे भेजा गया था।

पृष्ठभूमि: मुझे इस जानकारी की आवश्यकता है क्योंकि मैं इसे प्रतिक्रिया के आकार से तुलना करना चाहता हूं, जिसे gzip एन्कोडिंग का उपयोग करके भेजा गया था।

उत्तर

8

मैं commons-io CountingInputStream का उपयोग करूंगा, जो आपके लिए काम करेगा। एक पूर्ण लेकिन मामूली उदाहरण:

public long countContent(URL feedurl) { 
    CountingInputStream counter = null; 
    try { 
    HttpURLConnection con = (HttpURLConnection) feedurl.openConnection(); 
    counter = new CountingInputStream(con.getInputStream()); 
    String output = IOUtils.toString(counter); 
    return counter.getByteCount(); 
    } catch (IOException ex) { 
    throw new RuntimeException(ex); 
    } finally { 
    IOUtils.closeQuietly(counter); 
    } 
} 
+0

धन्यवाद कि मुझे वही चाहिए जो मुझे चाहिए। और मेवेन के साथ एक और निर्भरता चोट नहीं पहुंचीगी ;-) – er4z0r

2

आप FilterInputStream विस्तार कर सकते हैं, read(), read(byte[],int,int), और skip तरीकों अधिभावी ताकि super प्रपत्र बुला के बाद, वे पढ़े गए बाइट की संख्या के साथ एक काउंटर अद्यतन करें।

फिर इनमें से किसी एक के साथ URLConnection द्वारा लौटाई गई इनपुट स्ट्रीम को लपेटें, और मूल स्ट्रीम के स्थान पर रैपर का उपयोग करें। जब आप पूरा कर लेंगे, तो आप रैपर के काउंटर से पूछ सकते हैं।

अन्य ("मैनुअल") दृष्टिकोण ब्राउज़र में आंकड़ों को इकट्ठा करने के लिए वाईएसलो जैसे उपकरण या नेटवर्क पर यातायात की जांच करने के लिए वायरशर्क का उपयोग करेंगे।

+0

आपके उत्तर के लिए धन्यवाद! मुझे स्वीकार करना होगा कि मैं बहुत अच्छा और बहुत आलसी कोडर नहीं हूं। मैं इसके लिए अपने स्वयं के व्हील/हैक का आविष्कार करना पसंद नहीं करता हूं। इसलिए गलतियों से बचने और समय बचाने के लिए मैं एक स्थापित समाधान के रूप में कॉमन्स-आईओ से काउंटरिंग इनपुट स्ट्रीम का उपयोग करूंगा। आपके समय के लिए फिर से धन्यवाद! – er4z0r