2010-06-10 86 views
8

我一直在編寫一個用於StackApps API的Delphi庫。從TIdHttp獲取錯誤代碼400的響應

我遇到了Indy的問題。我正在使用Delphi 2010附帶的版本。 如果您將無效參數傳遞給其中一個StackApps API,它將返回一個HTTP錯誤代碼400,然後在響應中它將包含具有更多詳細信息的JSON對象。

通過在Chrome瀏覽器中訪問http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose,您可以看到一個示例。 I.E. Firefox會隱藏JSON。

使用WireShark我可以看到JSON對象使用下面的代碼返回,但我無法使用Indy訪問它。

對於此測試代碼,我在表單上放置了一個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異常。這就好像印第停止閱讀迴應。由於Memo1的內容是空的。

我正在尋找一種獲取JSON細節的方法。

回答

14

從調用Get()中刪除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

我糾正了。 – 2010-06-10 23:26:47

+2

是的AIgnoreReplies真的很擅長忽略回覆:-) – 2010-06-10 23:33:52

+0

我需要得到的迴應,所以你可以添加:Memo1.Lines.Add(IdHTTP1.ResponseText); – 2017-02-01 15:07:55