Подтвердить что ты не робот

Код только для ответа на IDHttp

Я использую idhttp (Indy) для проверки некоторых веб-сайтов. Все, что я хочу сделать, это проверить код ответа с сервера после отправки моего запроса, я не хочу, чтобы на самом деле нужно получать выходные данные HTML с сервера, поскольку я отслеживаю только код 200 OK, любой другой код означает, что есть проблема в какой-то форме.

Я искал документы справки 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;
4b9b3361

Ответ 1

TIdHTTP.Head() - лучший вариант.

Однако, в качестве альтернативы, в последней версии вы можете вызвать TIdHTTP.Get() с nil местом назначения 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;

Ответ 2

Попробуйте с http.head() вместо http.get().