簡體   English   中英

Indy 9開機自檢到https .aspx頁面時返回404錯誤

[英]indy 9 returning a 404 error when POSTing to https .aspx page

我將Indy 9 TIdHTTP組件與TIdSSLIOHandlerSocket一起使用以過TIdSSLIOHandlerSocket到aspx頁面( https://www.thedogs.co.nz/catch-the-action/results.aspx )以模擬在瀏覽器中看到的內容特定月份的比賽結果。 以下代碼下載2015年11月的結果。

首先,我得到的URL然后解析它來提取值__VIEWSTATE (theVS), __VIEWSTATEGENERATOR (theVSG)和__EVENTVALIDATION (theEV)。

然后我這樣做:

with HTTP do
begin
  AllowCookies := True;
  ProxyParams.BasicAuthentication := False;
  ProxyParams.ProxyPort := 0;
  Request.ContentLength := -1;
  Request.ContentRangeEnd := 0;
  Request.ContentRangeStart := 0;
  Request.Accept := 'text/html, */*';
  Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0;  rv:42.0)Gecko/20100101 Firefox/42.0';
  Request.ContentType:= 'application/x-www-form-urlencoded';
  Request.ContentEncoding := 'utf-8';
  HTTPOptions := [hoForceEncodeParams];
end;

Sl是TStringList ,M是TMemoryStream

Sl.Add('__VIEWSTATE="' + theVS + '"&');
Sl.Add('__VIEWSTATEGENERATOR="' + theVSG + '"&');
Sl.Add('__EVENTVALIDATION="' + theEV + '"&');
Sl.Add( 'txtCurrentDate="1/12/2015%2012:00:00%20a.m."&');
Sl.Add( 'txtAction="prevMonth"');

Url := 'https://www.thedogs.co.nz/catch-the-action/results.aspx';
HTTP.Post( Url, SL, M );
showmessage( 'sent' );
AssignFile( F, '.\downloaded\theresults' );
Rewrite( F );
M.Position := 0;
SL.LoadFromStream(M);

for X := 0 to SL.Count - 1 do
  WriteLn( F, SL[ X ] );

CloseFile( F );

我得到的只是例外

找不到HTTP / 1.1 404

任何幫助,最感謝!

您沒有正確格式化TStringList內容。 您需要擺脫"&字符,並且不要對值進行url編碼。當格式化實際的HTTP請求時, Post()在內部處理所有這些操作。

您還將設置一些不需要設置的Request屬性,或者將其設置為無效值。

Get()頁面以檢索Cookie和ViewState數據之后,對於后續請求,您沒有將Request.Referer屬性設置為相同的URL。 每當使用頁面上的鏈接或表單訪問另一頁面時,都需要相應地設置Referer標頭。 一些服務器會驗證以確保請求來自正確的位置。

嘗試這個:

with HTTP do
begin
  AllowCookies := True;
  ProxyParams.BasicAuthentication := False;
  ProxyParams.ProxyPort := 0;
  Request.Accept := 'text/html, */*';
  Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0;  rv:42.0)Gecko/20100101 Firefox/42.0';
  HTTPOptions := [hoForceEncodeParams];
end;

Url := 'https://www.thedogs.co.nz/catch-the-action/results.aspx';

... := HTTP.Get(Url, ...);
// parse HTML as needed...

Sl.Add('__VIEWSTATE=' + theVS);
Sl.Add('__VIEWSTATEGENERATOR=' + theVSG);
Sl.Add('__EVENTVALIDATION=' + theEV);
Sl.Add( 'txtCurrentDate=1/12/2015 12:00:00 a.m.');
Sl.Add( 'txtAction=prevMonth');

HTTP.Request.Referer := Url;

HTTP.Post( Url, SL, M );

M.Position := 0;
SL.LoadFromStream(M);
SL.SaveToFile( '.\downloaded\theresults' );
// or simply: M.SaveToFile( '.\downloaded\theresults' );

非常感謝大家的協助。 問題原來是Windows的“問題”。 幾年前,我的硬盤發生故障,在更換過程中,我升級到Win7。大約一年后,我決定升級到Windows 8。 盡快升級到8.1,最后幾個月前升級到10。

我想知道上面的內容是否與我的Delphi問題有關,所以我想看看驅動器C上的實際內容:-我注意到一個名為〜windows或windows.old之類的文件夾。 它的內部是一個完整的Windows文件集,但其中另一個是完整的WINDOWS文件夾。 長話短說,啟動到DOS提示符,並使用命令'del刪除了文件夾中的所有文件 / S / F / Q'然后刪除了所有文件夾,現在我很高興地報告說,我終於有了一個運行出色的Delphi + Indy10!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM