Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bei SOAP-ENV Header Namespace hinzufügen (https://www.delphipraxis.net/206863-bei-soap-env-header-namespace-hinzufuegen.html)

Samuel Kurmann 4. Feb 2021 14:04

Bei SOAP-ENV Header Namespace hinzufügen
 
Hallo Zusammen

Ich habe ein Problem mit dem erstellen eines XML's. Es geht dabei um den Soap Header, Beispiel:
Code:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Wie kriege ich es im Code hin den Namespace "xmlns:wsa="http://www.w3.org/2005/08/addressing"" zu definieren?

Hintergrundinfos:
Das XML ist mit Absicht nicht weiter ausgefüllt, was darin steht spielt für das Problem keine Rolle.
Im Soap Header kommen noch weitere Nodes rein, diese habe ich im Delphi mit einer TSoapHeader abgeleiteten Klasse definiert und danach mit "FRIO.SOAPHeaders.Send(Header);" hinzugefügt. Dies klappt auch prima. Nur den Namespace ("xmlns:wsa="http://www.w3.org/2005/08/addressing""), kriege ich nicht hin.
Ich habe kein WSDL dazu, es sind eigens geschriebene Objekte.

Mein Ziel wäre es nicht mit irgenwelchen "Replace" Funktionen oder ähnlichem rumzubasteln.

Incocnito 4. Feb 2021 15:40

AW: Bei SOAP-ENV Header Namespace hinzufügen
 
Vielleicht so:
Delphi-Quellcode:
  Result := NewXMLDocument.GetDocBinding('dingsbums', TXMLIrgendwas, TargetNamespace) as IXMLIrgendwas;
  Result.DeclareNamespace('wsa', 'http://www.w3.org/2005/08/addressing');
LG Icocnito

QuickAndDirty 4. Feb 2021 15:43

AW: Bei SOAP-ENV Header Namespace hinzufügen
 
Sorry wenn ich mich dumm anstelle, aber ich versuche deine Frage zu verstehen.
Der Soap-Webserverice liegt nicht als Quellocde oder WSDL oder als Interface typ vor?
Und du hättest gerne einen SOAP Client der den Webservice bedient?
Das einzige was du hast ist eine Mitgeschnittenes Kommunikationsbeispiel?

Ist das hier hilfreich?
Unter dem Inhaltsverzeichnis ist ein Beispiel XML .

https://www.w3.org/TR/2006/REC-ws-addr-soap-20060509/

Samuel Kurmann 5. Feb 2021 07:21

AW: Bei SOAP-ENV Header Namespace hinzufügen
 
Sorry für die ungenaue Beschreibung, ich versuche es nochmals ein bisschen genauer.

Ich habe schon eine WSDL, welche aber nicht von mir kommt und ich nicht anpassen kann/darf.
Im WSDL ist aber der Header nicht definiert sondern nur der Body. Den Header muss ich manuell vor dem versenden des XML's über
"FRIO.SOAPHeaders.Send(Header);" hinzufügen. Wobei hier "Header" meine eigene Klasse abgeleitet von TSoapHeader ist, welche aber nur den Teil zwischen "<SOAP-ENV:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">" und "</SOAP-ENV:Header>" definiert. Mir ist nun nicht klar, wie ich auf den Node "SOAP-ENV:Header" zugreifen kann.

Zitat:

Zitat von QuickAndDirty (Beitrag 1482249)
Das einzige was du hast ist eine Mitgeschnittenes Kommunikationsbeispiel?

Nein, ich habe hier aus Datenschutzgründen nur den Aufbau des XML's gezeigt, im Header und Body gibt es weitere Nodes, welche auch alle korrekt abgefüllt werden, es geht wirklich nur um den Namespace hinzuzufügen im Soap Header node.

@Incocnito funktioniert leider nicht, da ich nicht ein neues XMLDocument erstelle. Das DeclareNamespace kenne ich und ist wahrscheinlich die Antwort, aber es muss auf der richtigen Node gemacht werden, ich weiss nur nicht wie ich zu dieser Node komme.


Hoffe ich konnte das Problem nochmals ein bisschen besser erklären.

QuickAndDirty 5. Feb 2021 16:25

AW: Bei SOAP-ENV Header Namespace hinzufügen
 
OK.
Also du möchtest selber machen was der THTTPRIO Client den man bei der Codegeneration verwendet schon von alleine macht?
Ich lasse das leider immer von Delphi machen. Kann dir also dann wohl doch nicht helfen es von hand zu machen.

Ich lasse einfach dieses batchfile(je nach service angepasst) laufen und erhalte einen funktionierenden client.
Code:
c:
cd C:\MyClient
powershell.exe -Command "(new-object System.Net.WebClient).DownloadFile('http://MyService:8080/wsdl/IMYClient','MYClientWSDL.xml') "
Pause
c:
CD C:\Program Files (x86)\Embarcadero\Studio\21.0\bin
WSDLIMP -P -Ov+ -Oz- -DC:\MyClient C:\MyClient\MYClientWSDL.xml

QuickAndDirty 5. Feb 2021 16:51

AW: Bei SOAP-ENV Header Namespace hinzufügen
 
Also es gibt in der Unit
Delphi-Quellcode:
Soap.SOAPENV
eine Klasse
Delphi-Quellcode:
TSoapEnvelope
mider der Methode
Delphi-Quellcode:
MakeHeader
Wenn du die mit der option
Delphi-Quellcode:
[soSOAP12]
aufrufst erzeugt sie den header mit dem von dir gewünschten namespace

der namespace ist in der konstante
Unit Soap.SOAPConst
Delphi-Quellcode:
  SSoapNamespace = 'http://schemas.xmlsoap.org/soap/envelope/'; { do not localize }
  SSoap12Namespace = 'http://www.w3.org/2003/05/soap-envelope'; { do not localize }
  SOAPEnvelopeNamespaces: array[Boolean] of string = (SSoapNamespace, SSoap12Namespace);
hilft das?

Samuel Kurmann 9. Feb 2021 15:53

AW: Bei SOAP-ENV Header Namespace hinzufügen
 
@QuickAndDirty Hmmm ich hab es mir angeschaut und es sieht schon so aus, als könnte es helfen.

Leider finde ich bei mir nicht die richtige Stelle. Mein XMLDocument ist bereits im THTTPRIO und ich kann nicht mehr darauf zugreifen :(
Bzw. weiss ich nicht wie, das sollte doch irgendwie gehen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz