2012-01-13 15 views
9

मेरे कोड में मैं कुछ Http का उपयोग कुछ फ़ाइलों को स्ट्रीम के रूप में डाउनलोड करने का अनुरोध करता हूं। मैं निम्नलिखित कोड का उपयोग करता हूं:HTTP प्राप्त करें: केवल हेडर डाउनलोड करें? (HEAD समर्थित नहीं है)

public String getClassName(String url) throws ClientProtocolException, IOException { 
     HttpResponse response = sendGetRequestJsonText(url); 

     Header[] all = response.getAllHeaders(); 
     for (Header h : all) { 
      System.out.println(h.getName() + ": " + h.getValue()); 
     } 

     Header[] headers = response.getHeaders("Content-Disposition"); 
     InputStreamParser.convertStreamToString(response.getEntity().getContent()); 
     String result = ""; 
     for (Header header : headers) { 
      result = header.getValue(); 
     } 
     return result.substring(result.indexOf("''") + "''".length(), result.length()).trim(); 
    } 

लेकिन यह प्रतिक्रिया की पूरी सामग्री डाउनलोड करता है। मैं सामग्री के बिना केवल http शीर्षलेख पुनर्प्राप्त करना चाहता हूं। एक हेड अनुरोध काम नहीं करता है क्योंकि तब मुझे स्थिति 501 मिलती है, लागू नहीं होती है। मैं उसे कैसे कर सकता हूँ?

+1

बस प्रतिक्रिया निकाय को न पढ़ें? – irreputable

+0

@irreputable मैं यह करूँगा अगर मुझे पता चलेगा;) –

+1

'इनपुटस्ट्रीम पार्सर.कॉन्टरस्ट्रीम टॉस्ट्रिंग (response.getEntity()। GetContent()); 'इकाई क्या पढ़ रहा है; आप शायद ऐसा नहीं कर सकते हैं? –

उत्तर

17

इसके बजाय GET अनुरोध बनाने का, तो आप सिर्फ एक HEAD अनुरोध करने पर विचार हो सकता:

प्रमुख विधि सिवाय इसके कि प्राप्त करने के लिए समान है सर्वर नहीं होना चाहिए वापसी जवाब में संदेश-शरीर। एक हेड अनुरोध के जवाब में HTTP हेडर में मेटाफॉर्मेशन में शामिल है, जीईटी अनुरोध के जवाब में भेजी गई जानकारी के लिए समान होना चाहिए। यह विधि को अनुरोध द्वारा निकाली गई इकाई के बारे में मेटाफॉर्मेशन प्राप्त करने के लिए इकाई-शरीर को स्थानांतरित किए बिना अनुरोध किया जा सकता है। यह विधि अक्सर वैधता, अभिगम्यता, और हालिया संशोधन के लिए हाइपरटेक्स्ट लिंक का परीक्षण करने के लिए उपयोग की जाती है।

+0

मैंने कोशिश की, लेकिन हेडर अब अलग दिखता है :(मैंने फिर से जांच की है और स्टेटस कोड 501 है, लागू नहीं किया गया है। इसलिए मेरा सर्वर ऐसा अनुरोध संभाल नहीं रहा है। अन्य संभावनाएं? – RoflcoptrException

+0

@Roflcoptr - वह लंगड़ा है। आप * [रेंज'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) शीर्षलेख का उपयोग करने में सक्षम हो सकते हैं इकाई की 0-0 रेंज का अनुरोध करने के लिए। लेकिन मैंने कभी भी 'रेंज' हेडर या आंशिक प्रतिक्रियाओं का उपयोग नहीं किया है, इसलिए मैं वास्तव में उससे बात नहीं कर सकता। शायद कोई और इसमें घुस सकता है। साथ ही, यह संभव है कि सर्वर इन शीर्षकों को भी अनदेखा करें। –

+0

अभी के लिए मुझे एक कामकाज मिला है। मैं अनुरोध प्राप्त करता हूं लेकिन जैसे ही मैंने हेडर प्राप्त किया, मैं निरस्त कॉल करता हूं। क्या यह अच्छा अभ्यास है? – RoflcoptrException

5

आप प्रतिक्रिया इकाई में शामिल करने के लिए बाइट्स की एक श्रृंखला निर्दिष्ट करने के आपके अनुरोध में Range header का उपयोग करने में सक्षम हो सकते हैं। संभवत: कुछ इस तरह:

Range: bytes=0-0 

अगर यह काम करता है, तो आप वापस बाइट्स अपने Range हैडर प्रतिक्रिया इकाई में मौजूद में निर्दिष्ट के साथ एक 206 Partial Content प्राप्त करना चाहिए। हालांकि, मैं इस कोशिश की है नहीं, और यह भी गारंटी काम करने के लिए नहीं है:

एक सर्वर मई रेंज हैडर ध्यान न दें।

+1

क्या अजीब बात है कि एक सर्वर रेंज लागू करता है लेकिन सिर नहीं? भी, रेंज 0-0 1 बाइट कवर। – irreputable

+0

@irreputable - हाँ, यह भी मेरी सोच है; यह संभावना है कि सर्वर को गैर-लागू 'HEAD' के बाद यह उपलब्ध नहीं होगा। 1-बाइट चीज के लिए, आरएफई 2616 (सेक्शन 14.35.1) कहता है: * "यदि अंतिम-बाइट-पॉस मान मौजूद है, तो यह ** से अधिक या ** के बराबर होना चाहिए जो पहले-बाइट-पॉज़ में है बाइट-रेंज-स्पेक, या बाइट-रेंज-स्पेक सिंटेक्टिक रूप से अमान्य है। "* - मेरे लिए, यह कहता है कि 0-बाइट रेंज मान्य है। –

+1

0-0 मान्य है, लेकिन इसका मतलब है 1 बाइट, 0 वां बाइट।आप 0 बाइट्स का अनुरोध नहीं कर सकते; एक 206 प्रतिक्रिया 0 बाइट्स वापस नहीं कर सकता है। यह वास्तव में थोड़ा अजीब है। हालांकि अभ्यास में, 0 बाइट्स का अनुरोध उपयोगी नहीं होगा; लेकिन ऐसा करने में सक्षम नहीं है प्रोग्रामर प्रवृत्तियों के विपरीत है। – irreputable