2011-02-10 10 views
9

मैं कुछ वेबसाइट जांच करने के लिए idhttp (इंडी) का उपयोग कर रहा हूं। मैं बस इतना करना चाहता हूं कि मेरा अनुरोध भेजने के बाद सर्वर से प्रतिक्रिया कोड की जांच करें, मैं वास्तव में सर्वर से HTML आउटपुट प्राप्त नहीं करना चाहता क्योंकि मैं केवल 200 ओके कोड के लिए निगरानी कर रहा हूं, कोई भी अन्य कोड का अर्थ है कि कुछ रूपों का मुद्दा है।आईडीएचटीपी बस प्रतिक्रिया कोड प्राप्त करें

मैंने idhttp सहायता दस्तावेज़ों को देखा है और एकमात्र तरीका जिसे मैं संभवतः देख सकता हूं, यह कोड को MemoryStream पर असाइन करना होगा और फिर इसे सीधे साफ़ करें, हालांकि यह बहुत कुशल नहीं है और स्मृति का उपयोग करता है इसकी आवश्यकता नहीं है। क्या किसी साइट को कॉल करने और प्रतिक्रिया प्राप्त करने का कोई तरीका है लेकिन HTML को वापस भेज दिया गया है जो अधिक कुशल है और स्मृति को बर्बाद नहीं करता है?

वर्तमान में कोड इस तरह कुछ दिखाई देगा। हालांकि यह सिर्फ नमूना कोड है जिसे मैंने अभी तक परीक्षण नहीं किया है, मैं बस यह समझाने के लिए इसका उपयोग कर रहा हूं कि मैं क्या करने की कोशिश कर रहा हूं।

Procedure Button1Click(Sender: TObject); 

var 
http : TIdHttp; 
s : TStream; 
url : string; 
code : integer; 

begin 

    s := TStream.Create(); 
    http := Tidhttp.create(); 
    url := 'http://www.WEBSITE.com'; 

    try 

    http.get(url,s); 
    code := http.ResponseCode; 
    ShowMessage(IntToStr(code)); 

    finally 

    s.Free(); 
    http.Free(); 

end; 

उत्तर

12

TIdHTTP.Head() सबसे अच्छा विकल्प है। हालांकि, एक विकल्प के रूप में, नवीनतम संस्करण में आप TIdHTTP.Get() को शून्य गंतव्य TStream, या TIdEventStream के साथ किसी भी ईवेंट हैंडलर के साथ कॉल कर सकते हैं, और यह अभी भी सर्वर के डेटा को पढ़ेगा लेकिन इसे कहीं भी स्टोर नहीं करेगा।

किसी भी तरह से, यह भी ध्यान रखें कि यदि सर्वर एक विफलता वापस भेजता है ResponseCode, TIdHTTP एक अपवाद उठाएगा (जब तक आप AIgnoreReplies पैरामीटर का उपयोग विशिष्ट प्रतिक्रिया कोड मूल्य निर्दिष्ट करने के लिए करते हैं), तो आपको इसके लिए जिम्मेदार होना चाहिए साथ ही, उदाहरण के लिए:

procedure Button1Click(Sender: TObject); 
var 
    http : TIdHttp; 
    url : string; 
    code : integer; 
begin 
    url := 'http://www.WEBSITE.com'; 
    http := TIdHTTP.Create(nil); 
    try 
    try 
     http.Head(url); 
     code := http.ResponseCode; 
    except 
     on E: EIdHTTPProtocolException do 
     code := http.ResponseCode; // or: code := E.ErrorCode; 
    end; 
    ShowMessage(IntToStr(code)); 
    finally 
    http.Free(); 
    end; 
end; 

procedure Button2Click(Sender: TObject); 
var 
    http : TIdHttp; 
    url : string; 
    code : integer; 
begin 
    url := 'http://www.WEBSITE.com'; 
    http := TIdHTTP.Create(nil); 
    try 
    try 
     http.Get(url, nil); 
     code := http.ResponseCode; 
    except 
     on E: EIdHTTPProtocolException do 
     code := http.ResponseCode; // or: code := E.ErrorCode; 
    end; 
    ShowMessage(IntToStr(code)); 
    finally 
    http.Free(); 
    end; 
end; 
+0

मैं अभी इस कोड के साथ खेल रहा हूं। यह सब एक धागे के अंदर चलाता है, हालांकि यदि 200 कोड उत्तर के अलावा कुछ भी है उदा। 404, 302 आदि या सॉकेट त्रुटि यह थ्रेड को बाहर निकलने का कारण बनती है। – jskrwyk

+0

कोई भी प्रतिक्रिया कोड जो सफल पुनर्प्राप्ति का संकेत नहीं देता है, अपवाद उठाएगा। यदि आपका धागा अपवादों को संभालने में सक्षम नहीं है, या कम से कम विशेष अपवाद प्रकार को संभालने में सक्षम नहीं है, तो हां, धागा बाहर निकल जाएगा (और 'TThread.FatalException' प्रॉपर्टी सेट की जाएगी)। मेरे उदाहरण में, यह केवल 'EIdHTTPProtocolException' अपवादों को संभालने वाला है। यदि आवश्यक हो तो अन्य प्रकार के अपवादों को संभालने के लिए अपने थ्रेड कोड का विस्तार करें। –

+0

@RemyLebeau क्या होगा यदि हमें 'जारी रखें' '100' प्रतिक्रिया प्राप्त होती है? हमें फिर कोशिश करने की ज़रूरत होगी, है ना? – PSyLoCKe

8

http.head() बजाय http.get() साथ प्रयास करें।

+0

मैं इसे धन्यवाद देने का प्रयास करूंगा – jskrwyk

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