Главная страница
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.47 MB
Время: 0.008 c
15-1314563396
Юрий
2011-08-29 00:29
2011.12.18
С днем рождения ! 29 августа 2011 понедельник


1-1277298765
granulated
2010-06-23 17:12
2011.12.18
EInvalidPointer после выхода из функции.


2-1315135096
Pcrepair
2011-09-04 15:18
2011.12.18
Блокировка клавы и мыши для активных приложений


3-1268739476
Rob
2010-03-16 14:37
2011.12.18
СУБД с возможностью хранения текстовых документов в сжатом виде.


15-1314915157
картман
2011-09-02 02:12
2011.12.18
посоветуйте UPS