2014-06-23 92 views
3

我想使用TIdHTTP Indy工具訪問Delphi中的URL。 我也做了以下內容:URL不返回數據Delphi Indy TIdHttp

  • 設置接受Cookie =真
  • 集處理重定向=真
  • 增加了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。

該請求應該在德爾福的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 Output

+1

您能否將HTML的相關部分作爲文本加入? – mjn

回答

4

HttpRequest.Request.ContentType:= 'text/html的,應用/ XHTML + xml的,應用/ XML; Q = 0.9,圖像/ WEBP,/; Q = 0.8' ;

這不是有效的ContentType值。相反,這種價值屬於Request.Accept屬性。它告訴服務器客戶端將在響應中接受哪些ContentTypes。

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

您正在發佈一個空白TStringList。把一個網址到瀏覽器的地址欄發送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); 
+0

我已經添加了獲取請求,但由於某種原因,它好像沒有發佈實際數據,因爲它仍然返回登錄頁面HTML – user3564246

+0

Never Mind。我發現了問題並修復了它。謝謝你的解決方案 – user3564246