11

我正在使用 idhttp (Indy) 进行一些网站检查。我想要它做的就是在我的请求发送后检查来自服务器的响应代码,我不想实际接收来自服务器的 HTML 输出,因为我只监视 200 OK 代码,任何其他代码意味着存在某种形式的问题。

我查看了 idhttp 帮助文档,我可以看到的唯一方法是将代码分配给 aMemoryStream然后立即清除它,但这不是很有效并且使用不需要的内存. 有没有办法只调用一个站点并获得响应但忽略返回的 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()使用nildestinationTStream或未TIdEventStream分配事件处理程序的 a 进行调用,并且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 回答