Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.18;
Скачать: CL | DM;

Вниз

Отправка Soap Headers   Найти похожие ветки 

 
Servy ©   (2011-09-07 01:07) [1]

На случай, если кто-то найдет этот тред поиском, поделюсь воплощенным решением:

После копания генофонда, выяснилось, что добавлять чужие xmlns в SOAP:Envelope делфи не умеет в принципе, кроме того, нормального способа дописать их туда, не меняя пресловутый генофонд, или не используя ужас вроде StringReplace"а получившегося xml"я, не нашлось. Судя по всему, по спецификации SOAP"а, которую я полностью естесственно не осилил, эти самые xmlns можно писать и по месту, так, как это делает Делфи, то есть например так:


<SOAP-ENV:Envelope ...>
<SOAP-ENV:Body>
 <redeemVoucher xmlns="http://serviceurl">


вмето


<SOAP-ENV:Envelope xmlns:ns1="http://serviceurl/" ...>
<SOAP-ENV:Body>
 <ns1:redeemVoucher>


Соответственно, проблема была преобразована в другую: получить от Делфи заголовок вида:


<SOAP-ENV:Header>
 <Authorization xmlns="redeemVoucher">Basic b2N0b2JlcjoxMjM0</Authorization>
</SOAP-ENV:Header>


Так как с помощью опций и другого мелкого вмешательства этого добиться не удалось, пришлось вмешаться в процесс преобразования объект->xml, и написать свой класс заголовка такого вида:


 TAuthHeader = class(TSOAPHeader)
 private
   FAuthorization: string;
 published
   property Authorization: string read FAuthorization write FAuthorization;

 public
   function   ObjectToSOAP(RootNode, ParentNode: IXMLNode;
                           const ObjConverter: IObjConverter;
                           const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions;
                           out RefID: InvString): IXMLNode; override;

 end;

type
 TSOAPDomConvAccess = class(TSOAPDomConv);

function TAuthHeader.ObjectToSOAP(RootNode, ParentNode: IXMLNode;
 const ObjConverter: IObjConverter; const NodeName, NodeNamespace,
 ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions;
 out RefID: InvString): IXMLNode;
var
 Conv: TSOAPDomConv;
begin
 Result := ParentNode.AddChild("Authorization", "redeemVoucher", False);

 Conv := (ObjConverter as TSOAPDomConv);
 RefId := TSOAPDomConvAccess(Conv).GetNewID;

 Result.Text := FAuthorization;
end;


В результате добавления заголовка такого класса, генерируется требуемый xml, без двойного тега в SOAP-header и с нужным неймспейсом, и сервис на другом конце это дело успешно ест.



Страницы: 1 вся ветка

Текущий архив: 2011.12.18;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.008 c
15-1314915157
картман
2011-09-02 02:12
2011.12.18
посоветуйте UPS


1-1277700449
George
2010-06-28 08:47
2011.12.18
Создание службы - отказывается запускаться


2-1315223947
vasiliy87
2011-09-05 15:59
2011.12.18
Вопрос о параметрах интефейсных функций


2-1315504959
x2088
2011-09-08 22:02
2011.12.18
Системное меню окна


2-1315307915
alexx777
2011-09-06 15:18
2011.12.18
сменить пользователя