Иногда в процессе разработки веб-сервисов на языке Object Pascal (Delphi) возникает потребность скрыть некоторые стандартные интерфейсы, такие как IAppServer и IAppServerSOAP, которые отображаются по умолчанию на главной странице веб-сервиса. Это может быть нежелательным, если клиентские программы не используют эти интерфейсы напрямую.
Проблема
На главной странице веб-сервиса по умолчанию отображаются интерфейсы IAppServer и IAppServerSOAP, которые являются предками пользовательского интерфейса веб-сервиса. Хотя клиентские программы не используют эти интерфейсы, они все равно отображаются, что может вызвать путаницу.
Решение
Для решения этой проблемы можно использовать несколько подходов. Один из них заключается в изменении WSDL, возвращаемого сервисом, с помощью компонента TWSDLHTMLPublish, добавленного на форму WebModule. В обработчике события OnBeforePublishingWSDL можно переопределить WSDL, исключив нежелательные интерфейсы.
Однако, как было отмечено в комментариях, данный подход не решает проблему изменения начальной страницы веб-сервиса. В таком случае, можно воспользоваться другим методом: редактирование метода WebModule2DefaultHandlerAction, который является обработчиком события OnAction элемента WebActionItem с именем DefaultHandler.
В этом методе был добавлен вызов процедуры HideInterfaces, которая принимает содержимое ответа и список интерфейсов для скрытия. Процедура HideInterfaces удаляет строки из HTML-контента, содержащие нежелательные интерфейсы.
procedure HideInterfaces(var aContent: String; aInterfaces: array of string);
var
Intf: String;
i: Integer;
begin
if Length(aInterfaces) = 0 then
Exit;
with TStringList.Create do
try
// Удаляем все символы перевода строки
aContent := StringReplace(aContent, #13#10, ' ', [rfReplaceAll]);
// Разделяем контент на строки, используя TR
Text := StringReplace(aContent, '<tr>', #13#10'<tr>'#13#10, [rfReplaceAll, rfIgnoreCase]);
Text := StringReplace(Text, '</tr>', #13#10'</tr>'#13#10, [rfReplaceAll, rfIgnoreCase]);
// Проходим по каждой строке, чтобы найти и скрыть интерфейсы
for Intf in aInterfaces do
begin
for i := 0 to Pred(Count) do
begin
if Pos(LowerCase(Intf), LowerCase(Strings[i])) > 0 then
Break;
end;
// Если интерфейс найден, удаляем соответствующие строки таблицы
if i < Count then
begin
Delete(i + 1);
Delete(i);
Delete(i - 1);
end;
end;
aContent := Text;
finally
Free;
end;
end;
Также был предложен альтернативный подход: отказ от реализации интерфейсов IAppServer и IAppServerSOAP, что возможно, если ваши клиентские приложения не зависят от них. В этом случае можно использовать класс-предок, который не включает эти интерфейсы, например, TDataModule или TInvokableClass.
Подтвержденное решение
В итоге был найден способ скрыть нежелательные интерфейсы, отредактировав метод WebModule2DefaultHandlerAction и добавив в него вызов процедуры HideInterfaces. Этот метод позволяет удалить упоминания интерфейсов из HTML-контента ответа веб-сервиса.
Заключение
Скрытие интерфейсов IAppServer и IAppServerSOAP на главной странице веб-сервиса в Delphi может быть выполнено с помощью изменения HTML-контента ответа сервиса. Это может быть полезным, если клиентские программы не используют эти интерфейсы, и их присутствие на странице вводит в заблуждение. Приведенный выше код может служить примером реализации такого подхода.
Необходимо скрыть интерфейсы IAppServer и IAppServerSOAP на главной странице веб-сервиса, разработанного в Delphi, чтобы убрать нежелательные для пользователя элементы, которые не используются клиентскими приложениями.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.