2010-06-10 37 views
8

Tôi đã viết thư viện Delphi cho API StackApps.Nhận phản hồi từ TIdHttp với Mã lỗi 400

Tôi đã gặp sự cố với Indy. Tôi đang sử dụng phiên bản đi kèm với Delphi 2010. Nếu bạn chuyển các tham số không hợp lệ cho một trong các API StackApps, nó sẽ trả về Mã lỗi HTTP 400 và sau đó trong phản hồi nó sẽ chứa một đối tượng JSON với nhiều chi tiết hơn.

Bằng cách truy cập http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose trong Trình duyệt Chrome, bạn có thể xem Ví dụ. I E. và Firefox ẩn JSON.

Sử dụng WireShark Tôi có thể thấy rằng đối tượng JSON được trả về bằng cách sử dụng mã bên dưới, nhưng tôi không thể truy cập nó bằng Indy.

Đối với mã kiểm tra này, tôi đã bỏ một thành phần TIdHttp vào biểu mẫu và đặt mã sau vào một lần nhấp nút.

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; 

Tôi đã vượt qua [400] để không tăng 400 ngoại lệ. Nó như thể Indy ngừng đọc câu trả lời. Vì nội dung của Memo1 trống.

Tôi đang tìm cách lấy chi tiết JSON.

Trả lời

14

Xóa giá trị tham số AIgnoreReplies khỏi cuộc gọi của bạn thành Get(). Hãy để nó tăng ngoại lệ bình thường. Văn bản JSON bạn đang tìm nằm trong thuộc tính EIdHTTPProtocolException.ErrorMessage. Ví dụ:

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

Tôi đã sửa. –

+2

Và có AIgnoreReplies là thực sự tốt tại bỏ qua các trả lời :-) –

+0

Tôi cần thiết để có được phản ứng là tốt, vì vậy bạn có thể thêm: Memo1.Lines.Add (IdHTTP1.ResponseText); –

Các vấn đề liên quan