10

StackApps API用の Delphi ライブラリを作成しています。

Indy で問題が発生しました。Delphi 2010 に同梱されているバージョンを使用しています。無効なパラメータをいずれかの StackApps API に渡すと、HTTP エラー コード 400 が返され、応答に詳細を含む JSON オブジェクトが含まれます。

Chrome ブラウザでhttp://api.stackoverflow.com/0.8/stats/?Key=BadOnPurposeにアクセスすると、例が表示されます。IE と 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 の詳細を取得する方法を探しています。

4

1 に答える 1

19

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; 
于 2010-06-10T22:55:41.590 に答える