Мне нужно отправить что-то вроде этого:
<soapenv:Header>
<ser:userName>admin</ser:userName>
<ser:userPassword>secret</ser:userPassword>
</soapenv:Header>
Импортер Delphi WSDL, сгенерировал это:
userName2 = class(TSOAPHeader)
private
FValue: string;
published
property Value: string read FValue write FValue;
end;
userName = type string;
WsService = interface(IInvokable)
function call(const userName: userName; const userPassword: userPassword);
и зарегистрировал тип как:
InvRegistry.RegisterHeaderClass(TypeInfo(WsService), userName2, 'userName', 'http://localhost/path/to/services');
Проблема заключается в том, что , когда я вызываю его с помощью кода, созданного delphi, он помещает имя пользователя и пароль в раздел "Тело" сообщения SOAP, а не в заголовке.
Итак, я попытался отправить заголовки самостоятельно, например:
Изменено определение типа для наследования класса userName2, потому что я не могу отправить строку с помощью метода ISOAPHeaders.Send().
userName = class(userName2);
Затем отправили заголовки:
user := userName.Create;
user.Value := 'admin';
WS := GetWsService;
(WS as ISOAPHeaders).Send(user);
Теперь заголовки находятся в правильном месте, но они отправляются следующим образом:
<SOAP-ENV:Header>
<NS1:userName xmlns:NS1="http://localhost/path/to/services">
<Value xmlns="http://localhost/path/to/services">admin</Value>
</NS1:userName>
</SOAP-ENV:Header>
Почти там, но Мне не нужно свойство Value, я просто хочу простой простой тег в заголовке.
Как я могу это сделать?
Спасибо.
== EDIT ==
В соответствии с запросом WSDL находится здесь: http://desenvolvimento.lemontech.com.br:8081/wsselfbooking/WsSelfBookingService?wsdl
Пользовательский интерфейс SOAP импортировал его и сгенерировал этот запрос образца:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://lemontech.com.br/selfbooking/wsselfbooking/services">
<soapenv:Header>
<ser:userPassword></ser:userPassword>
<ser:userName></ser:userName>
<ser:keyClient></ser:keyClient>
</soapenv:Header>
<soapenv:Body>
<ser:pesquisarSolicitacao>
<!--You have a CHOICE of the next 2 items at this level-->
<idSolicitacaoRef></idSolicitacaoRef>
<dataInicial></dataInicial>
<dataFinal></dataFinal>
<registroInicial>1</registroInicial>
<!--Optional:-->
<quantidadeRegistros>50</quantidadeRegistros>
</ser:pesquisarSolicitacao>
</soapenv:Body>
</soapenv:Envelope>
Этот образец запроса работает очень хорошо, но я не могу понять, как сделать этот вызов в Delphi.