2010-03-12 125 views
2

我在delphi Tidhttp組件中遇到了問題,其中GET過程無法獲取特定的url,但在其他正在工作的url上。例如:這段代碼返回一個空的response.datastring。 Response.datastring僅在使用此error_url時爲空,但在其他urls中,response.datastring具有值。我需要獲取該error_url的內容來解決這個問題。tidhttp get procedure not working on urls

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Response : TStringStream; 
    error_url: string; 
begin 
    error_url := 'http://www.chefscatalog.com/international/home.aspx'; //error url 
    Response := TStringStream.Create; 
    try 
    IdHTTP1.Get(error_url, Response); 
    Memo1.Text := Response.DataString; 
    finally 
    FreeAndNil(Response); 
    end; 
end; 

順便說一下,idHTTP1重定向屬性設置爲true,所以重定向不是問題。

這是我所遇到的異常: 1. HTTP/1.1 302實測值 2. EDecompressionError與消息 'zlib的錯誤(-3)'

可以下載源代碼(這是indytest.zip)這個鏈接中的項目http://www.yourfilelink.com/get.php?fid=534933

請幫幫我吧。在此先感謝:)

+0

那麼,它是做什麼的,而不是抓取URL?它是否引發異常?哪一種?你有沒有得到一個HTTP狀態碼?哪一個? – 2010-03-12 05:45:40

+0

'「這段代碼無法獲取error_url,但是如果您將error_url更改爲其工作的任何有效url」',那麼您還會期待什麼?相反(一個錯誤的URL工作和一個有效的網址不會)是奇怪的,不是嗎? – 2010-03-12 08:15:25

+0

@PA:該URL現在至少是一個有效的URL,並且服務器愉快地返回一個帶有頁面的200 OK。所以我想在OP的問題中「有效的URL」是一個類型錯誤。 – 2010-03-12 08:53:30

回答

2

原因是你試圖打的網站正在尋找一個cookie,如果它沒有設置它嘗試設置它,然後做一個302重定向回它自己。

由於您沒有連接Cookie管理器,因此網站不斷檢查cookie,設置並重定向,最終導致302重定向循環。

處理cookie和不過似乎由於某種原因,印地無視正在本網站發送的cookie會工作得很好,只有一個302


。我颳起了一些測試代碼,如果我打http://www.google.com我得到

New cookie: PREF 
New cookie: NID 
Redirecting (1) to: http://www.google.co.nz/ 
New cookie: PREF 
New cookie: NID 

這是谷歌發送

Set-Cookie: PREF=ID=3c7e441914b902ae:TM=1268686477:LM=1268686477:S=Z-Gwqx52jK0V1rYR; expires=Wed, 14-Mar-2012 20:54:37 GMT; path=/; domain=.google.com 
Set-Cookie: NID=32=vsOZvkr4AOZ7320d_OBPf2zR2jau4E6pupbOe_ZaaX4DNjahTzSV-mSA55naTk-5cXQcn7SNEp7uSxbE_cFrL9ZftGApTGZMPGKzcz3_NZE_2MYpWG5PGbwWFw9t2d_R; expires=Tue, 14-Sep-2010 20:54:37 GMT; path=/; domain=.google.com; HttpOnly 

但是對於其他網站的標題,我得到這個在我的調試輸出

Redirecting (1) to: http://www.chefscatalog.com/error.aspx?impsid=0 
Redirecting (2) to: http://www.chefscatalog.com/error.aspx?impsid=0 

一路高達15嘗試.. 如果我們看看網站發回什麼標題

Set-Cookie: ASP.NET_SessionId=4o0bpi45evee0d45qos1uy55; path=/; HttpOnly 
Set-Cookie: ChefsSite=CartID=00000000-0000-0000-0000-000000000000&cst=f4t8YpBpAAkNiRUd9BEf2luKAA%3d%3d&act=c0f2VBCSbv30F4kasnvWS5OfJQ%3d%3d&CookiesEnabled=False; expires=Wed, 14-Apr-2010 20:54:22 GMT; path=/ 

我注意到那裏的網站缺少Set-Cookie結束的域名,這很奇怪,但我不認爲它是RFC的必須。如果我們看一下idCookieManager的AddCookie/2方法,它需要該參數的主機,所以它可能不適用於任何不提供域的Set-Cookies。

我已經在更多的網站上測試了這一點,所有的工作都很好,如果Set-Cookie包含domain = .google.com;

這也是有趣的是,在idHttp.OnRedirect如果你看看

idHttp.Response.RawHeaders.Text

爲不工作,你看不到套裝 - 現場餅乾,但是,網站,做的工作你看到的Set-餅乾...

但是,如果我設置idhttp用戶代理到

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1 

(從另一個答案)

那麼似乎皮卡餅乾就好

New cookie: ASP.NET_SessionId 
    New cookie: ChefsSite 
    Redirecting (1) to: http://www.chefscatalog.com/international/home.aspx 
    New cookie: ChefsSite 

奇怪。

+0

試圖掛鉤一個cookie管理器,但仍然無法正常工作。 – 2010-03-15 12:45:27

+0

嗨,您的權利,它在useragent和餅乾,它沒有被重定向到錯誤頁面了...現在的工作......剩下的問題是,如果是一個連接到tidhttp的壓縮器會產生錯誤zlib錯誤(-3)。無論如何生病可能會找到一種方式編程方式分離壓縮機,如果重定向計數達到最大值......非常感謝你釘了它......:D – 2010-03-15 23:32:13

1

檢查OnRedirect事件。出於某種原因,您正被重定向到錯誤頁面。

http://www.chefscatalog.com/error.aspx?impsid=0

,反過來,將您重定向回同樣的錯誤頁面,直到你用盡你RedirectMaximum(15)。

更新:

一旦你被重定向到錯誤頁面,WIZZARD下面解釋爲什麼它不斷地一遍又一遍重定向回同樣的錯誤頁面。餅乾。

您首先被重定向的原因可能是該網站無法識別(或類似)您的user agent string(在Request屬性中)。默認情況下,它是「Mozilla/3.0(兼容; Indy庫)」。將其更改爲FireFox,IE或其他已識別的瀏覽器使用的當前字符串。

我試過用「Mozilla/5.0(X11; U; Linux i686; en-US; rv:1.9.2.1)Gecko/20100122 firefox/3.6.1」,它似乎工作得很好。

你可以在Indy KB PDF找到更多的細節。

+0

我在該頁面上看不到此類重定向。 TIdHTTP的重定向處理僅適用於HTTP級重定向。如果該頁面使用這種重定向,用戶將永遠不會看到錯誤頁面內容。 – 2010-03-12 23:53:50

+0

嗨布魯斯,我會調查你的建議。我會給你反饋。非常感謝:) – 2010-03-13 04:28:16

+0

@Remy,我沒有看頁碼。我只是啓用了重定向並連接了OnRedirect事件。我不確定它是如何重定向的,只是該事件與該目的地一起發生。 – 2010-03-13 10:20:35