URL-адрес не возвращает данные Delphi Indy TIdHttp

Я пытаюсь получить доступ к URL-адресу в Delphi с помощью инструмента TIdHTTP Indy Tool. Я сделал следующее:

  • Установите Accept Cookies = True.
  • Установите Handle Redirect = True
  • Добавлен TIdCookieManager

http://sms.saicomvoice.co.za:8900/saicom/index.php?action=login&username=SOME_USERNAME&password=SOME_PASSWORD&login=login

Запрос на публикацию работает и возвращает HTML. Проблема в том, что он не возвращает правильный HTML (см. Изображение ниже).

Если я возьму этот URL-адрес (введите имя пользователя и пароль) и вставлю его в свой браузер точно так же, как мое приложение Delphi, тогда войдет на правильный веб-сайт. Но как только я сделаю это с помощью своего приложения Delphi, оно вернет HTML-код для страницы входа.

Предполагается, что запрос должен выполняться своевременно в TTimer в Delphi.

Может ли кто-нибудь привести меня к правильному пути или указать направление, в котором я могу решить эту проблему?

Дополнительная информация

  • WriteStatus - это процедура, которая записывает вывод в TListBox.
  • BtnEndPoll Останавливает таймер

    Procedure TfrmMain.TmrPollTimer(Sender: TObject);
    Var
      ResultHTML: String;
      DataToSend: TStringList;
    Begin
      Inc(Cycle, 1);
    
      LstStatus.Items.Add('');
      LstStatus.Items.Add('==================');
      WriteStatus('Cycle : ' + IntToStr(Cycle));
      LstStatus.Items.Add('==================');
      LstStatus.Items.Add('');
    
      DataToSend := TStringList.Create;
    
      Try
        WriteStatus('Setting Request Content Type');
        HttpRequest.Request.ContentType := 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
        WriteStatus('Setting Request User Agent');
        HttpRequest.Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.0b8';
    
        WriteStatus('Posting Request');
        ResultHTML := HttpRequest.Post(FPostToURL, DataToSend);
        WriteStatus('Writing Result');
        FLastResponse := ResultHTML;
    
        WriteStatus('Cycle : ' + IntToStr(Cycle) + ' -- FINISHED');
        LstStatus.Items.Add('');
      Except
        On E: Exception Do
          Begin
            MakeNextEntryError := True;
            WriteStatus('An Error Occured: ' + E.Message);
    
            If ChkExceptionStop.Checked Then
              Begin
                BtnEndPoll.Click;
                WriteStatus('Stopping Poll Un Expectedly!');
              End;
          End;
      End;
    End;
    

* Пример изображения *

Вывод HTML


person user3564246    schedule 23.06.2014    source источник
comment
не могли бы вы вместо этого включить соответствующую часть HTML в виде текста?   -  person mjn    schedule 23.06.2014


Ответы (1)


HttpRequest.Request.ContentType: = 'text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, /; q = 0.8';

Это недопустимое значение ContentType. Вместо этого такое значение принадлежит свойству Request.Accept. Он сообщает серверу, какие типы содержимого клиент примет в ответ.

ResultHTML: = HttpRequest.Post (FPostToURL, DataToSend);

Вы публикуете пустой TStringList. При вводе URL-адреса в адресную строку браузера отправляется запрос GET, а не запрос POST, поэтому вместо этого следует использовать TIdHTTP.Get():

ResultHTML := HttpRequest.Get('http://sms.saicomvoice.co.za:8900/saicom/index.php?action=login&username=SOME_USERNAME&password=SOME_PASSWORD&login=login');

Вы должны использовать TIdHTTP.Post(), если хотите имитировать веб-форму HTML, отправляемую на сервер (поскольку она указывает method=post), например:

DataToSend.Add('username=SOME_USERNAME');
DataToSend.Add('password=SOME_PASSWORD');
DataToSend.Add('login=Login');
ResultHTML := HttpRequest.Post('http://sms.saicomvoice.co.za:8900/saicom/index.php?action=login', DataToSend);
person Remy Lebeau    schedule 23.06.2014
comment
Я добавил Get Request, но по какой-то причине он как будто не отправляет фактические данные, потому что он по-прежнему возвращает HTML-код страницы входа. - person user3564246; 24.06.2014
comment
Не бери в голову. Я нашел проблему и исправил ее. Спасибо, ваше решение помогло - person user3564246; 24.06.2014