Как отправить пользовательские данные в заголовке SOAP-сообщения в Delphi, используя WSDL
Отправка пользовательских данных и паролей в заголовки SOAP в Delphi через WSDL
Вопрос, заданный пользователем, связан с использованием механизма SOAP-заголовков в Delphi для отправки пользовательских данных, таких как имя пользователя и пароль, в WSDL-сервис. Основная проблема заключается в том, что Delphi WSDL импортер генерирует классы, которые не позволяют отправить данные напрямую в заголовок SOAP, а помещают их в тело сообщения. Пользователь пытался самостоятельно отправить заголовки, но столкнулся с тем, что данные отправлялись в формате с вложенным тегом Value, что ему не подходит.
Решение проблемы
Чтобы решить проблему, необходимо использовать специальное значение IS_TEXT для индекса свойства, которое позволит Delphi правильно сериализовать данные в SOAP-заголовок без вложенного тега Value. Для этого создаем новый класс TSimpleHeader, наследующийся от TSOAPHeader, и регистрируем его в системе вызова компонентов (Invoke Registry).
const
IS_TEXT = $0020;
type
TSimpleHeader = class(TSOAPHeader)
private
FValue: string;
published
property Value: string Index (IS_TEXT) read FValue write FValue;
end;
userName = class(TSimpleHeader);
var
WsService: TWsService;
procedure RegisterUserNameHeader;
begin
InvRegistry.RegisterHeaderClass(TypeInfo(WsService), userName, 'userName', 'http://localhost/path/to/services');
end;
После регистрации нового класса, можно использовать его для отправки данных в заголовок SOAP:
var
User: userName;
begin
User := userName.Create;
User.Value := 'username';
(WsService as ISOAPHeaders).Send(User);
end;
Использование значения IS_TEXT в индексе свойства Value предотвращает создание вложенного тега Value и позволяет разместить строку значения свойства непосредственно внутри тега userName.
Альтернативное решение
Также возможно переопределить функцию ObjectToSOAP для класса TSOAPHeader, что позволит контролировать процесс сериализации:
type
TSOAPCredentials = class(TSoapHeader)
private
FPassword: string;
FUsername: string;
FKeyClient: string;
public
function ObjectToSOAP(...): IXMLNode; override;
published
property userName: string read FUsername write FUsername;
property userPassword: string read FPassword write FPassword;
property keyClient: string read FKeyClient write FKeyClient;
end;
function TSOAPCredentials.ObjectToSOAP(...): IXMLNode;
begin
Result := ParentNode.AddChild('userName');
Result.Text := FUsername;
// Повторить для других свойств
end;
Это позволяет напрямую задать структуру XML для каждого свойства, которое должно быть отправлено в SOAP-заголовок.
Заключение
Оба предложенных решения позволяют отправить простые теги в SOAP-заголовок без вложенных элементов, что решает проблему пользователя. Выбор между этими решениями зависит от конкретных требований и предпочтений разработчика.
Пользователь столкнулся с проблемой отправки пользовательских данных в SOAP-заголовки при использовании Delphi и WSDL-сервиса, и ищет решение для корректной сериализации данных без вложенных тегов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS