2017-03-27 4 views
2

Ich kann den folgenden Code verwenden, um die HTML-Quelle von der URL zu erhalten, aber wie kann ich die eigentliche URL selbst erhalten? Da manchmal die anfängliche URL einige Weiterleitungen durchläuft und die tatsächliche URL nicht die gleiche ist, möchte ich sie zur Verwendung erfassen. Ich kann keine gute Dokumentation über die Verwendung von Methoden oder Eigenschaften für WinHTTP in Delphi finden. Vielen Dank!Gibt es eine Möglichkeit, die endgültige URL nach Weiterleitungen mit WinHTTP in Delphi zu erhalten?

var http: variant; 
begin 
http:=createoleobject('WinHttp.WinHttpRequest.5.1'); 
http.open('GET', 'http://URLtoWebsite.com', false); 
http.send; 
showmessage(http.responsetext); 
end; 
+0

Warum nicht eine etablierte Bibliothek wie Indy oder ICS verwenden? –

+1

Zuerst habe ich Indy verwendet, und dann selbst mit dem sslIOhandler, hat es immer noch Probleme mit vielen SSL-Sites. Also dachte ich, es wäre einfacher, stattdessen winhttp zu verwenden. Es ist definitiv einfacher für die Quell-HTML. Aber ich bin definitiv offen für andere Optionen, wenn nicht mit Winhttp möglich. Und möchte auch Indy meiden, es sei denn, es gibt keine andere Alternative. – gts6

+0

OK, aber warum verwenden Sie den COM/OLE-Wrapper anstelle von [WinInet] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa385331.aspx) oder [WinHTTP] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925.aspx) API direkt? Es gibt keinen wirklichen Vorteil für die Verwendung des COM/OLE-Wrappers außer in Skriptumgebungen. Sehen Sie sich 'InternetQueryOption()' mit dem Flag 'INTERNET_OPTION_URL' oder' HttpQueryInfo() 'mit den Flags' HTTP_QUERY_CONTENT_LOCATION', 'HTTP_QUERY_LOCATION' und' HTTP_QUERY_URI' an. –

Antwort

2

Sie können so etwas wie dieses

function GetFinalURL(const AMainURL: string): string; 
var 
    http: Variant; 
begin 
    Result := ''; 
    http := CreateOleObject('WinHttp.WinHttpRequest.5.1'); 
    http.Option(6) := False; 
    http.open('GET', AMainURL, false); 
    http.send; 
    if http.Status = 302 then 
    Result := http.getResponseHeader('Location') 
    else 
    Result := AMainURL; 
end; 

Eine andere Art und Weise verwenden mit Indy

function GetFinalURL(const AMainURL: string): string; 
var 
    idHTTP: TIdHTTP; 
begin 
    Result := ''; 
    idHTTP := TIdHTTP.Create(nil); 
    try 
    idHTTP.HandleRedirects := True; 
    try 
     idHTTP.Get(AMainURL); 
     Result := idHTTP.Request.URL; 
    except 
    end; 
    finally 
    idHTTP.Free; 
    end; 
end; 
+0

In WinHTTP ist Option 6 "WinHttpRequestOption_EnableRedirects" und "http.getResponseHeader ('Location") 'darf keine vollständige URL sein. In Indy darf 'TIdHTTP.Request.URL' ebenfalls keine vollständige URL sein. Redirects können relativ zu der zuvor angeforderten URL sein. Daher müssen Sie möglicherweise die beiden URLs kombinieren, z. B. mit der Win32-API-Funktion "UrlCombine()". –

+0

also dann scheint es, dass es nicht möglich ist mit streng WinHTTP, ist das richtig? Ich denke, ich bin stecken Indy dann – gts6

+0

@ gts6 Die Wahl wird Ihnen gehören, müssen Sie entscheiden, welche Bibliothek Sie verwenden möchten. Die obigen Funktionen beantworten Ihre Q mit 'WinHTTP' und' Indy'. – RepeatUntil

Verwandte Themen