IdHttp просто получить код ответа - PullRequest
10 голосов
/ 10 февраля 2011

Я использую 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;

Ответы [ 2 ]

14 голосов
/ 11 февраля 2011

TIdHTTP.Head() - лучший вариант.Однако, в качестве альтернативы, в последней версии вы можете вызывать TIdHTTP.Get() с нулевым адресатом TStream или TIdEventStream без назначенных обработчиков событий, и он все равно будет считывать данные сервера, но не сохранять их в любом месте.

В любом случае, также имейте в виду, что если сервер отправляет ответный код сбоя, 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; 
8 голосов
/ 10 февраля 2011

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

...