Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разбор URL на сегменты в Delphi

Delphi , Интернет и Сети , URL

Разбор URL на сегменты в Delphi

В процессе разработки веб-приложений или работы с сетью часто возникает необходимость разобрать URL на составляющие части. Например, для получения данных о протоколе, хосте, пути и других параметрах из строки URL. В этой статье мы рассмотрим, как это сделать в Delphi.

Структура URL

Предположим, у нас есть следующий URL:

http://login:password@somehost.somedomain.com:8080/some_path/something_else.html?param1=val&param2=val#nose

Разобьем его на сегменты:

  • http: протокол (protocol)
  • login:password: имя пользователя и пароль (username и password)
  • somehost.somedomain.com: хост (host)
  • 8080: порт (port)
  • /some_path/something_else.html: путь (path)
  • param1=val&param2=val: строка запроса (query string)
  • nose: фрагмент (fragment)

Использование встроенного класса TIdURI

Одним из простых способов разбора URL в Delphi является использование класса TIdURI, который входит в состав компоненты Indy. Этот класс предоставляет удобный интерфейс для работы с URL.

Пример использования TIdURI:

uses
  ..., IdURI;

var
  URI: TIdURI;

begin
  URI := TIdURI.Create('http://login:password@somehost.somedomain.com:8080/some_path/something_else.html?param1=val&param2=val#nose');
  try
    // Доступ к составляющим URL
    Writeln('Протокол:', URI.Protocol); // http
    Writeln('Имя пользователя:', URI.Username); // login
    Writeln('Пароль:', URI.Password); // password
    Writeln('Хост:', URI.Host); // somehost.somedomain.com
    Writeln('Порт:', URI.Port); // 8080
    Writeln('Путь:', URI.Path); // /some_path/something_else.html
    Writeln('Строка запроса:', URI.Params); // param1=val&param2=val
    Writeln('Фрагмент:', URI.Fragment); // nose
  finally
    URI.Free;
  end;
end;

Использование WinInet

Если по какой-то причине вы не хотите использовать Indy, можно воспользоваться функцией InternetCrackUrl из библиотеки WinInet. Однако стоит учитывать, что это приведет к зависимости от Windows и WinInet.

Пример использования InternetCrackUrl:

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  WinInet;

procedure ParseURL(const lpszUrl: string);
var
  lpszScheme, lpszHostName, lpszUserName, lpszPassword, lpszUrlPath, lpszExtraInfo: array[0..MaxInt] of Char;
  lpUrlComponents: TURLComponents;
begin
  ZeroMemory(@lpszScheme, SizeOf(lpszScheme));
  ZeroMemory(@lpszHostName, SizeOf(lpszHostName));
  ZeroMemory(@lpszUserName, SizeOf(lpszUserName));
  ZeroMemory(@lpszPassword, SizeOf(lpszPassword));
  ZeroMemory(@lpszUrlPath, SizeOf(lpszUrlPath));
  ZeroMemory(@lpszExtraInfo, SizeOf(lpszExtraInfo));
  ZeroMemory(@lpUrlComponents, SizeOf(TURLComponents));

  lpUrlComponents.dwStructSize := SizeOf(TURLComponents);
  lpUrlComponents.lpszScheme := lpszScheme;
  lpUrlComponents.dwSchemeLength := SizeOf(lpszScheme);
  lpUrlComponents.lpszHostName := lpszHostName;
  lpUrlComponents.dwHostNameLength := SizeOf(lpszHostName);
  lpUrlComponents.lpszUserName := lpszUserName;
  lpUrlComponents.dwUserNameLength := SizeOf(lpszUserName);
  lpUrlComponents.lpszPassword := lpszPassword;
  lpUrlComponents.dwPasswordLength := SizeOf(lpszPassword);
  lpUrlComponents.lpszUrlPath := lpszUrlPath;
  lpUrlComponents.dwUrlPathLength := SizeOf(lpszUrlPath);
  lpUrlComponents.lpszExtraInfo := lpszExtraInfo;
  lpUrlComponents.dwExtraInfoLength := SizeOf(lpszExtraInfo);

  InternetCrackUrl(PChar(lpszUrl), Length(lpszUrl), ICU_DECODE or ICU_ESCAPE, lpUrlComponents);

  Writeln(Format('Протокол : %s', [lpszScheme]));
  Writeln(Format('Хост     : %s', [lpszHostName]));
  Writeln(Format('Пользователь : %s', [lpszUserName]));
  Writeln(Format('Пароль   : %s', [lpszPassword]));
  Writeln(Format('Путь     : %s', [lpszUrlPath]));
  Writeln(Format('Доп. информация: %s', [lpszExtraInfo]));
end;

begin
  try
    ParseURL('http://login:password@somehost.somedomain.com:8080/some_path/something_else.html?param1=val&param2=val#nose');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Оба примера демонстрируют, как разобрать URL на сегменты в Delphi. Использование встроенного класса TIdURI является более предпочтительным вариантом, так как не зависит от внешних библиотек и проще в использовании. Однако, если у вас уже есть проект, использующий WinInet, можно воспользоваться функцией InternetCrackUrl.

Создано по материалам из источника по ссылке.

Данный текст представляет собой инструкцию по разбору URL на сегменты в Delphi, с примерами использования встроенного класса TIdURI и функции InternetCrackUrl из библиотеки WinInet.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: URL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:22:17/0.0054190158843994/1