В процессе работы с веб-ресурсами иногда возникает необходимость получить финальный URL после прохождения всех переадресаций. В данной статье мы рассмотрим, как это можно сделать, используя WinHTTP в Delphi.
Подтвержденный ответ:
Использование WinHTTP в Delphi для получения финального URL после переадресаций может показаться сложной задачей, но на самом деле это не так. Существует несколько способов решить эту проблему, и мы рассмотрим два из них: с использованием WinHTTP и Indy.
Способ 1: WinHTTP
При использовании WinHTTP для получения финального URL после переадресаций можно воспользоваться функцией WinHttpSetStatusCallback, которая позволяет получать уведомления о каждом redirects, происходящем во время запроса. Вот пример кода, демонстрирующий, как это можно сделать на Object Pascal (Delphi):
function GetFinalURL(const AMainURL: string): string;
var
http: Variant;
status: LongInt;
flags: LongInt;
begin
Result := '';
http := CreateOleObject('WinHttp.WinHttpRequest.5.1');
try
http.Option(6) := False; // Disable redirects
http.open('GET', AMainURL, false);
http.setStatusCallback(WinHttpSetStatusCallback(@WinHttpStatusCallback, WINHTTP_CALLBACK_FLAG_REDIRECT), 0);
http.send;
repeat
status := http.Status;
flags := 0;
if (status = WINHTTP_STATUS_REDIRECTION) then
flags := WINHTTP_CALLBACK_FLAG_REDIRECT;
WinHttpSetStatusCallback(http, @WinHttpStatusCallback, flags, 0);
until (status <> WINHTTP_STATUS_REDIRECTION);
if (status = WINHTTP_STATUS_OK) then
Result := http.getResponseHeader('Location')
else
Result := AMainURL;
finally
http.Free;
end;
end;
function WinHttpStatusCallback(hRequest: LongInt; dwInternetStatus: LongInt; dwInfo: LongInt; dwContext: LongInt; dwStatus: LongInt): LongInt; stdcall;
begin
Result := 0;
case dwInternetStatus of
WINHTTP_CALLBACK_STATUS_REDIRECTION:
begin
// Process redirection here
end;
// Process other statuses here
end;
end;
Способ 2: Indy
Если вы все же решили использовать Indy для получения финального URL после переадресаций, можно воспользоваться свойством TIdHTTP.Request.URL. Вот пример кода, демонстрирующий, как это можно сделать на Object Pascal (Delphi):
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;
Альтернативный ответ:
В комментариях к вопросу было предложено использовать другие библиотеки, такие как Indy или ICS, вместо WinHTTP. Однако, как показано выше, WinHTTP также может быть использован для получения финального URL после переадресаций, хотя и с некоторой дополнительной настройкой.
Заключение:
В данной статье мы рассмотрели, как получить финальный URL после переадресаций с WinHTTP в Delphi. Мы рассмотрели два способа решения этой задачи: с использованием WinHTTP и Indy. Оба способа имеют свои преимущества и недостатки, и выбор между ними зависит от конкретных требований вашего проекта.
Статья о получении финального URL после переадресаций с помощью WinHTTP в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS