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

Роутинг URL с иерархией в Web Broker Server на Delphi

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

При разработке веб-приложений на Delphi с использованием Web Broker Server часто возникает необходимость обрабатывать URL-адреса с иерархической структурой. Например, вам может потребоваться обработать запрос вида:

http://myserver.com/versions/2013.6.0.0/ML/Files/SomeFile.exe

В этом случае путь к ресурсу (/versions/2013.6.0.0/ML/Files/SomeFile.exe) не соответствует какой-либо реальной директории на сервере. Тем не менее, сервер должен уметь извлекать из этого пути необходимую информацию для обработки запроса.

В данной статье мы рассмотрим, как можно обрабатывать URL-адреса с иерархической структурой в Web Broker Server на Delphi.

Описание проблемы

У вас есть HTTP-сервер на основе Web Broker, который должен обрабатывать запросы, подобные приведенному выше. Сервер hosts информацию и отдельные файлы для автоматических обновлений программного обеспечения, где задействовано множество обновляемых файлов.

Вы создаете обработчик запросов в веб-модуле для этого, но путь к ресурсу (Request.PathInfo) имеет вид:

/versions/2013.6.0.0/ML/Files/SomeFile.exe

Однако вам нужно извлечь из него только первый сегмент:

/versions

Затем обработать следующий номер версии:

/2013.6.0.0

После чего обработать редакцию приложения:

/ML

Затем указать, что вы ищете определенные файлы, связанные с этой комбинацией версии/редакции:

/Files

Наконец, указать сам файл:

/SomeFile.exe

Решение проблемы

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

Если путь указан, разбейте его на сегменты, используя символ "/". Для этого можно воспользоваться встроенным классом TStringList в Delphi. Создайте экземпляр TStringList и добавьте в него сегменты пути, разделяя их символом "/".

Затем проанализируйте первый сегмент пути. В зависимости от его значения вызовите соответствующий обработчик, который будет обрабатывать остальные сегменты пути. Например, если первый сегмент равен "versions", вызовите обработчик HandleVersionCheck, который будет обрабатывать сегменты, связанные с версиями программного обеспечения.

Внутри HandleVersionCheck (или любого другого обработчика) проанализируйте каждый сегмент пути и выполните необходимые действия. Например, если сегмент равен "update", верните поток полного установщика версии. Если сегмент равен "files", верните поток определенного файла.

Ниже приведен пример кода на Object Pascal (Delphi), демонстрирующий этот подход:

unit uUpdateServerWebModule;

interface

uses
  System.SysUtils, System.Classes, Web.HTTPApp, Update.Common;

type
  TWebModule1 = class(TWebModule)
  private
    procedure WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure HandleVersionCheck(Request: TWebRequest; Response: TWebResponse;
      PathInfo: TStringList);
    procedure HandleInfoCheck(Request: TWebRequest; Response: TWebResponse;
      PathInfo: TStringList);
    procedure HandleException(Request: TWebRequest; Response: TWebResponse;
      PathInfo: TStringList; const Code: Integer);
  end;

var
  WebModuleClass: TComponentClass = TWebModule1;

implementation

{$R *.dfm}

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  L: TStringList;
  S, T: String;
  P: Integer;
begin
  // Разбейте URL по символам "/" на список
  L:= TStringList.Create;
  try
    S:= Request.PathInfo;
    if Copy(S, Length(S)-1, 1) <> '/' then
      S:= S + '/';
    Delete(S, 1, 1);
    while Length(S) > 0 do begin
      P:= Pos('/', S);
      T:= Copy(S, 1, P-1);
      Delete(S, 1, P);
      L.Append(T);
    end;
    if L.Count > 0 then begin
      // Обработайте список пути
      if LowerCase(L[0]) = 'ver' then begin
        HandleVersionCheck(Request, Response, L);
      end else
      if LowerCase(L[0]) = 'info' then begin
        HandleInfoCheck(Request, Response, L);
      end else begin
        HandleException(Request, Response, L, 0);
      end;
    end else begin
      // Не указано никакой страницы, верните основную страницу
      Response.Content:= 'Application Update Server';
    end;
  finally
    L.Free;
  end;
end;

procedure TWebModule1.HandleVersionCheck(Request: TWebRequest;
  Response: TWebResponse; PathInfo: TStringList);
var
  EC: String;
  FN: String;
  Ver: TVersion;
begin
  if LowerCase(PathInfo[1]) = 'info' then begin
    // Следующий параметр: Код редакции
    EC:= LowerCase(PathInfo[2]);
    if (EC = 'ml') or (EC = 'sl') or (EC = 'lt') then begin
      // Верните текущую информацию о версии для указанной редакции программного обеспечения...
    end else begin
      HandleException(Request, Response, PathInfo, 4);
    end;
  end else begin
    // Следующий параметр: Номер версии(ы)
    Ver:= TVersion.Create;
    try
      Ver.Version:= PathInfo[1];
      if (Ver.Ver1 > 0) and (Ver.Ver2 > 0) then begin
        // Следующий параметр: Код редакции
        EC:= LowerCase(PathInfo[2]);
        if (EC = 'ml') or (EC = 'sl') or (EC = 'lt') then begin
          // Следующий параметр: Команды версии/редакции
          if LowerCase(PathInfo[3]) = 'update' then begin
            // Верните поток полного установщика версии...
            Response.ContentType:= 'application/octet-stream';

          end else
          if LowerCase(PathInfo[3]) = 'files' then begin
            // Следующий параметр: Определенное имя файла
            FN:= PathInfo[4];
            // Верните поток определенного файла...
            Response.ContentType:= 'application/octet-stream';

          end else begin
            HandleException(Request, Response, PathInfo, 1);
          end;
        end else begin
          HandleException(Request, Response, PathInfo, 2);
        end;
      end else begin
        HandleException(Request, Response, PathInfo, 3);
      end;
    finally
      Ver.Free;
    end;
  end;
end;

procedure TWebModule1.HandleInfoCheck(Request: TWebRequest;
  Response: TWebResponse; PathInfo: TStringList);
begin
  // Верните информацию о всех программных продуктах и их текущих версиях...
end;

procedure TWebModule1.HandleException(Request: TWebRequest;
  Response: TWebResponse; PathInfo: TStringList; const Code: Integer);
begin
  // Верните информацию об ошибке...
  Response.Content:= 'EXCEPTION: '+IntToStr(Code);
end;

end.

В данном примере показано, как можно обрабатывать URL-адреса с иерархической структурой в Web Broker Server на Delphi. Обратите внимание, что это всего лишь пример, и его можно Modify в соответствии с вашими конкретными требованиями.

Используя описанный подход, вы сможете эффективно обрабатывать URL-адреса с иерархической структурой в Web Broker Server на Delphi.

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

При разработке веб-приложений на Delphi с использованием Web Broker Server часто требуется обрабатывать URL-адреса с иерархической структурой.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-17 02:06:52/0.0058000087738037/0