私はこのようなものを送る必要があります:
<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');
問題は、デルファイで生成されたコードを使用して呼び出すと、 userName とパスワードが SOAP メッセージの Body セクションではなく、 Header に配置されることです。
そこで、次のようにヘッダーを自分で送信してみました。
ISOAPHeaders.Send() メソッドを使用して文字列を送信できないため、型定義を userName2 クラスから継承するように変更しました。
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」プロパティは必要ありません。ヘッダーに単純な単純なタグが必要なだけです。
どうすればいいですか?
ありがとう。
==編集==
リクエストに応じて、WSDL は次の場所にあります: http://desenvolvimento.lemontech.com.br:8081/wsselfbooking/WsSelfBookingService?wsdl
SOAP UI がそれをインポートし、このサンプル リクエストを生成しました。
<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 でこの呼び出しを行う方法がわかりません。