Envoyer des chaînes simples dans l'en-tête SOAP de Delphi
J'ai besoin d'envoyer quelque chose comme ceci:
<soapenv:Header>
<ser:userName>admin</ser:userName>
<ser:userPassword>secret</ser:userPassword>
</soapenv:Header>
Delphi importateur WSDL généré ceci:
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);
et enregistré au type:
InvRegistry.RegisterHeaderClass(TypeInfo(WsService), userName2, 'userName', 'http://localhost/path/to/services');
Le problème est que quand je l'appelle à l'aide de delphi code généré, il met le nom d'utilisateur et mot de passe dans le Corps du message SOAP, pas dans l'en-Tête.
J'ai donc essayé d'envoyer les en-Têtes de moi-même, comme ceci:
Changé la définition de type d'hériter de la nomdutilisateur2 classe parce que je ne peux pas envoyer une chaîne de caractères à l'aide de la ISOAPHeaders.La méthode Send ().
userName = class(userName2);
Ensuite envoyé les en-têtes:
user := userName.Create;
user.Value := 'admin';
WS := GetWsService;
(WS as ISOAPHeaders).Send(user);
Maintenant les en-têtes sont à la bonne place, mais ils sont envoyés comme ceci:
<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>
Presque là, mais je ne veux pas la "Valeur" des biens, je veux juste une plaine simple balise dans l'en-tête.
Comment puis-je le faire?
Grâce.
== EDIT ==
Comme demandé, le WSDL est ici: http://desenvolvimento.lemontech.com.br:8081/wsselfbooking/WsSelfBookingService?wsdl
SOAP UI importées et produites de cette demande d'échantillon:
<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>
Cet exemple de requête fonctionne très bien, mais je ne peux pas comprendre comment le faire cet appel à Delphes.
source d'informationauteur Fabio Gomes
Vous devez vous connecter pour publier un commentaire.
Solution:
Il n'était pas très évident, mais j'ai juste eu à ajouter de la IS_TEXT de la valeur à la Indice et de déclarer une nouvelle TSOAPHeader descendant, la solution était comme ça:
Puis de l'enregistrer cet en-tête:
Et d'envoyer l'en-Tête manuellement:
Fondamentalement, la IS_TEXT valeur dans l'Index empêche Delphi à partir de la création d'un nom d'utilisateur et de balise d'une Valeur de balise à l'intérieur d'elle. Il seulement des lieux de la chaîne de la Valeur de la propriété à l'intérieur de la balise userName.
Il est triste de constater que l'Indice clétage est utilisé pour quelque chose de si pas évident, aussi la documentation à ce sujet est difficile à trouver et difficile à comprendre:
Source: http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Remotable_Objects
Vous pouvez remplacer la sérialisation pour tout
TSOAPHeader
classe.Juste de remplacer son
ObjectToSOAP
fonction.Je suis venu avec cette:
résultats dans cette en-tête de requête:
Vous pouvez injecter les balises à l'aide d'un stringreplace sur la chaîne XML droit avant qu'il ne passe la porte "sur le fil". Vous avez besoin d'un RIO_BeforeExecute gestionnaire, et vous pouvez alors faire face à l'SOAPRequest directement.