2011-02-10 15 views
9

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

私はidhttpのヘルプドキュメントを調べましたが、可能な限りこれを行うには、コードを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; 

答えて

12

TIdHTTP.Head()が最適です。ただし、最新のバージョンでは、またはイベントハンドラが割り当てられていないTIdEventStreamという無宛先のTIdHTTP.Get()を呼び出すことはできますが、それでもサーバーのデータは読み取れますが、どこにも格納されません。

いずれにしても、サーバーがResponseCodeを失敗した場合、TIdHTTPは例外を発生させます(AIgnoreRepliesパラメータを使用して特定のResponseCode値を指定しない限り)。同様に、例えば:

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; 
+0

をあげる私はちょうどより、このコードで遊んでてきました。これらはすべてスレッド内で実行されますが、200コード応答以外のものがあれば、 404、302などのエラーが発生したり、ソケットエラーが発生したりすると、スレッドが終了します。 – jskrwyk

+0

リトリーブが成功したことを示す応答コードでは、例外が発生します。あなたのスレッドが例外を処理していない場合、または少なくとも実際に発生した例外タイプを処理していない場合は、スレッドは終了します(そして 'TThread.FatalException'プロパティが設定されます)。私の例では、 'EIdHTTPProtocolException'例外のみを処理しています。必要に応じて、他のタイプの例外を処理するスレッドコードを展開します。 –

+0

@RemyLebeau「続行」「100」応答を受け取ったらどうなりますか?もう一度やり直す必要がありますよね? – PSyLoCKe

8

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

+0

私はそれを試してみるのおかげ – jskrwyk

関連する問題