3

我正在尝试使用 TIdHTTP Indy 工具访问 Delphi 中的 URL。我做了以下事情:

  • 设置接受 Cookie = True
  • 设置句柄重定向 = True
  • 添加了 TIdCookieManager

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

Post 请求有效并返回 HTML。问题是它没有返回正确的 HTML(见下图)。

如果我使用该 URL(填写用户名和密码)并将其粘贴到我的浏览器中,与我的 Delphi 应用程序完全相同,然后登录到正确的网站。但只要我使用我的 Delphi 应用程序执行此操作,它就会返回登录页面的 HTML。

该请求应该在 Delphi 的 TTimer 中及时执行。

任何人都可以引导我走向正确的道路或为我指明如何解决这个问题的方向吗?

一些附加信息

  • 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 输出

4

1 回答 1

4

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

这不是一个有效值ContentType。这种价值属于Request.Accept财产。它告诉服务器客户端将在响应中接受哪些 ContentType。

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);
于 2014-06-23T16:05:03.853 回答