[英]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.