2010-06-10 18 views
8

के साथ TIdHttp से प्रतिक्रिया प्राप्त करना मैं StackApps एपीआई के लिए डेल्फी लाइब्रेरी लिख रहा हूं।त्रुटि कोड 400

मैंने इंडी के साथ एक समस्या में भाग लिया है। मैं संस्करण का उपयोग कर रहा हूं जो डेल्फी 2010 के साथ जहाजों का उपयोग कर रहा है। यदि आप स्टैकएपपीएस एपीआई में से किसी एक के लिए अमान्य पैरामीटर पास करते हैं तो यह एक HTTP त्रुटि कोड 400 लौटाएगा और फिर प्रतिक्रिया में इसमें अधिक जानकारी के साथ एक JSON ऑब्जेक्ट होगा।

क्रोम ब्राउज़र में http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose पर जाकर आप एक उदाहरण देख सकते हैं। अर्थात। और फ़ायरफ़ॉक्स जेएसओएन छुपाता है।

वायरशर्क का उपयोग करके मैं देख सकता हूं कि JSON ऑब्जेक्ट नीचे दिए गए कोड का उपयोग करके वापस कर दिया गया है, लेकिन मैं इंडी का उपयोग करके इसे एक्सेस करने में असमर्थ हूं।

इस परीक्षण कोड के लिए मैंने फॉर्म पर एक TIdHttp घटक गिरा दिया और एक बटन क्लिक में निम्नलिखित कोड रखा।

procedure TForm10.Button2Click(Sender: TObject); 
var 
SS : TStringStream; 
begin 
    SS := TStringStream.Create; 
    IdHTTP1.Get('http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose',SS,[400]); 
    Memo1.Lines.Text := SS.DataString; 
    SS.Free; 
end; 

मैंने पारित किया [400] ताकि यह 400 अपवाद नहीं उठाए। ऐसा लगता है जैसे इंडी ने प्रतिक्रिया पढ़ना बंद कर दिया। चूंकि मेमो 1 की सामग्री खाली है।

मैं JSON विवरण प्राप्त करने का एक तरीका ढूंढ रहा हूं।

उत्तर

14

प्राप्त करने के लिए अपने कॉल से AIgnoreReplies पैरामीटर मान निकालें()। इसे आम तौर पर अपवाद बढ़ाएं। जो JSON टेक्स्ट आप खोज रहे हैं वह EIdHTTPProtocolException.ErrorMessage प्रॉपर्टी में है। उदाहरण के लिए:

procedure TForm10.Button2Click(Sender: TObject); 
begin 
    try 
    Memo1.Lines.Text := IdHTTP1.Get('http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose'); 
    except 
    on E: EIdHTTPProtocolException do begin 
     if E.ErrorCode = 400 then 
     Memo1.Lines.Text := E.ErrorMessage 
     else 
     raise; 
    end; 
    end; 
end; 
+0

मैं सही खड़ा हूं। –

+2

और हाँ AIgnoreReplies जवाबों को अनदेखा करने में वास्तव में अच्छा है :-) –

+0

मुझे प्रतिक्रिया भी प्राप्त करने की आवश्यकता है, ताकि आप जोड़ सकें: Memo1.Lines.Add (IdHTTP1.ResponseText); –

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