Форум: "Начинающим";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];
ВнизОтправка 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c