2014-01-28 43 views
0

我有一個網址,將帶我到一個不同的URL地址。這很可能是通過URL重定向。我需要採取初始網址並確定「最終結果」頁面的網址的方式。我環顧四周,推薦Indy組件TIdHTTP。這是最好的(也叫做最簡單/最簡單)的方法嗎?由於我對這種類型的編碼幾乎沒有經驗,如果任何人有示例代碼分享,它將不勝感激。Delphi - 如何識別URL重定向的最終結果地址?

作爲一個例子,這裏是我有一個出發網址...

https://www.google.com/url?q=https://stackoverflow.com/questions/21392490/how-to-convert-date-time-into-date-using-netezza&ct=ga&cd=MTAwODU3OTM3OTYxNDU5ODk3Nw&cad=CAEYAA&usg=AFQjCNHTTseazfoavOyO68Kr8izCswpj_g

感謝

+0

印迪可以。您必須發出HEAD或GET請求並處理[重定向狀態](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3),直到獲得[成功狀態](http:/ /www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2)。 –

回答

1

我建議執行一個簡單的GET請求並處理OnRedirect事件保存最後一個被重定向到的地址。如果需要,您還可以保存中間地址。

我寫了一個小類來處理這個問題,在您的項目範圍內,您可能會將這些方法添加到需要結果的類中,而不是封裝它。

TRedirectTester = class 
    private 
    Address: string; 
    procedure RedirectProc(Sender: TObject; var dest: string; 
     var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod); 
    public 
    function RedirectionResult(InitialURL: string): string; 
    end; 

我定義了一個公共職能重定向和私有程序後返回最終URL分配給OnRedirect事件(因此簽名)和存儲重定向目的地的變量。

關於實施,請記住將HandleRedirects設置爲true以啓用重定向,必須分配IOHandler以便能夠處理HTTPS。每次發生重定向時,將調用分配給OnRedirect事件的方法,因此我們可以保存目標。

procedure TRedirectTester.RedirectProc(Sender: TObject; var dest: string; 
    var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod); 
begin 
    Address := dest; 
end; 

function TRedirectTester.RedirectionResult(InitialURL: string): string; 
    var IdHttp: TIdHTTP; 
begin 
    Address := InitialURL; 
    IdHttp := TIdHTTP.Create(nil); 
    try 
    with IdHttp do 
    begin 
     HandleRedirects := true; 
     OnRedirect := RedirectProc; 
     IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create; 
     try 
     Get(InitialURL); 
     finally 
     IOHandler.Free; 
     end; 
    end; 
    finally 
    IdHttp.Free; 
    end; 
    Result := Address; 
end;