2017-03-27 2 views
2

Je peux utiliser le code suivant pour obtenir facilement la source HTML de l'URL, mais comment puis-je obtenir l'URL elle-même? Parce que parfois l'URL initiale traverse certaines redirections et l'URL réelle n'est pas la même et je voudrais la capturer pour l'utilisation. Je n'arrive pas à trouver une bonne documentation sur l'utilisation des méthodes ou propriétés pour winHTTP dans Delphi. Merci!Est-il possible d'obtenir l'URL finale après les redirections utilisant WinHTTP dans Delphi?

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

Pourquoi ne pas utiliser une bibliothèque établie tels que Indy ou ICS? –

+1

Initialement, j'ai utilisé indy, et même avec le sslIOhandler, il y a toujours des problèmes avec beaucoup de sites SSL. J'ai donc pensé qu'il serait plus simple d'utiliser winhttp à la place. C'est certainement plus simple pour saisir le code source html. Mais je suis définitivement ouvert à d'autres options si ce n'est pas possible en utilisant winhttp. Et voudrais éviter indy aussi bien à moins theres aucune autre alternative. – gts6

+0

OK, mais pourquoi utilisez-vous le wrapper COM/OLE, au lieu d'utiliser le [WinInet] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa385331.aspx) ou [WinHTTP] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925.aspx) API directement? Il n'y a aucun avantage réel à utiliser le wrapper COM/OLE sauf dans les environnements de script. Regardez 'InternetQueryOption()' avec l'indicateur 'INTERNET_OPTION_URL', ou' HttpQueryInfo() 'avec les drapeaux' HTTP_QUERY_CONTENT_LOCATION', 'HTTP_QUERY_LOCATION' et' HTTP_QUERY_URI'. –

Répondre

2

Vous pouvez utiliser quelque chose comme ça

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; 

Une autre façon en utilisant 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

Dans WinHTTP, l'option 6 est 'WinHttpRequestOption_EnableRedirects', et' http.getResponseHeader ('Location') 'n'est peut-être pas une URL complète. Dans Indy, 'TIdHTTP.Request.URL' peut ne pas être une URL complète non plus. Les redirections peuvent être relatives à l'URL précédemment demandée, vous devrez donc combiner les deux URL, par exemple avec la fonction UrlCombine() 'de l'API Win32. –

+0

alors il semblerait que ce n'est pas possible d'utiliser strictement winHTTP, est-ce exact? Je suppose que je suis coincé en utilisant Indy puis – gts6

+0

@ gts6 Le choix sera à vous, Vous devez décider quelle bibliothèque vous voulez utiliser. Les fonctions ci-dessus répondant à votre Q en utilisant 'WinHTTP' et' Indy'. – RepeatUntil