При разработке веб-приложений на Delphi с использованием Web Broker Server часто возникает необходимость обрабатывать URL-адреса с иерархической структурой. Например, вам может потребоваться обработать запрос вида:
В этом случае путь к ресурсу (/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