11

idhttp (Indy) を使用して Web サイトのチェックを行っています。私がやりたいのは、リクエストが送信された後にサーバーからの応答コードをチェックすることだけです.200 OKコードを監視しているだけなので、実際にサーバーからHTML出力を受信する必要はありません.他のコードは、何らかの形の問題があることを意味します。

私はidhttpのヘルプドキュメントを調べましたが、これを行うことができる唯一の方法は、コードをaに割り当ててから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;
4

2 に答える 2

16

TIdHTTP.Head()が最良の選択肢です。

ただし、別の方法として、最新バージョンではTIdHTTP.Get()nildestination TStream、またはTIdEventStreamイベント ハンドラを割り当てずに を呼び出しTIdHTTP、サーバーのデータを読み取りますが、どこにも保存しません。

いずれにせよ、サーバーが失敗の応答コードを送り返した場合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;

更新:EIdHTTPProtocolException失敗時に発生するのを避けるためhoNoProtocolErrorExceptionに、プロパティでフラグを有効にすることができTIdHTTP.HTTPOptionsます:

procedure Button1Click(Sender: TObject);
var
  http : TIdHttp;
  url : string;
  code : integer;
begin
  url := 'http://www.WEBSITE.com';
  http := TIdHTTP.Create(nil);
  try
    http.HTTPOptions := http.HTTPOptions + [hoNoProtocolErrorException];
    http.Head(url);
    code := http.ResponseCode;
    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
    http.HTTPOptions := http.HTTPOptions + [hoNoProtocolErrorException];
    http.Get(url, nil);
    code := http.ResponseCode;
    ShowMessage(IntToStr(code));
  finally
    http.Free;
  end;
end;
于 2011-02-10T21:33:09.427 に答える
8

http.head()の代わりに試してみてくださいhttp.get()

于 2011-02-10T20:22:19.863 に答える