![]() |
SOAP WSDL Import ohne Header - Tokyo 10.2
Hi :cyclops:
Ich stehe gerade vor folgendem Problem bei dem ich nicht so Recht weiter komme. Ich versuche einen Webservice via WSDL Anzubinden, die WSDL ist öffentlich zugänglich, deshalb denke ich mal ist es auch keine großes Problem den Link hier zu Posten. ![]() Die WSDL wird sauber importiert und ich kann die entsprechenden Klassen ansprechen. Ein Anmeldung mit den Benutzerdaten funktioniert auch, super. Jetzt zum Problem. Beim Connect mit den Benutzerdaten antwortet mir das System mit KostenstellenID im Header der Responce. Theoretisch bin ich davon ausgegangen, Delphi geht damit einfach im Hintergrund selbstständig um, leider ist das nicht der Fall. Bei jeder weiteren Anfrage bekomme ich die Fehlermeldung UUID nicht übertragen. Stimmt auch, wenn ich mit Wireshark mitlese, fehlt bei meinem POST der Header in gänze. Mein Frage, wie bekomm ich den da rein und vor allem wie bekommen die Klassen davon etwas mit? Ähnliche Probleme hier: ![]() ![]() ![]() Gruß PJM |
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Bei den von dir verlinkten "ähnlichen Problemen" wurden doch auch Lösungen aufgezeigt. Hast Du die mal durchgeschaut?
|
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Hi Union,
Zitat:
Ich hab ja einen Body mit den eigentlichen Informationen die mir die Wrapper Class automatisch durch den WSDl Import generiert, wenn ich jetzt nur dem Headobject den Header migeben und dann .send aufrufe, wird doch auch nur der Head teil geschickt und nicht der Body Part um den es mir ja eigentlich geht, oder bin ich da ganz falsch gewickelt? |
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Neuer Tag neues Glück :)
Ich hab es mittlerweile hin bekommen den SOAP-HEADER zu erweitern. Ich mache es mit dem ObjectToSOAP Event eines TsoapHeader Objekts und CASTE mein Webservice als ISOAPHeader sieht dann so aus:
Delphi-Quellcode:
Leider bekomme ich die Anfrage nicht passend hin...
type
TUUID = class(TSoapHeader) private FUUID: string; public function ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter; const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode; override; published property UUID: string read FUUID write FUUID; end; .... function TUUID.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter; const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString) : IXMLNode; begin Result := ParentNode.AddChild('UUID'); Result.Text := UUID; end; procedure TForm1.Button1Click(Sender: TObject); var WebServiceKostenstelle: wsKostenstelleObj; lHeader : TSOAPHeader; lUUID : TUUID; begin WebServiceKostenstelle := GetwsKostenstelleObj(true, '', HTTPRIO1); lUUID:= TUUID.Create; lUUID.UUID:='DEMO-UUID'; (WebServiceKostenstelle as ISOAPHeaders).send(luuid); WebServiceKostenstelle.Connect_wsKostenstelle('', '', ''); end; erwartet wird folgendes:
Code:
Meine Anfrage erzeugt aber das:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:kos="virrpcKostenstelle/kostenstelle">
<soapenv:Header> <kostenstelleID xsi:type="kos:kostenstelleID"> <UUID xsi:type="xsd:string">05a7df56e81ee20b:7328b961:1406ccf6a97:-7fff;<virrpcKostenstelle|PX-279394|PO>;tliStYV2ghJRLlJRXflTXg==</UUID> </kostenstelleID> </soapenv:Header>
Code:
Wer langsam wahnsinnig und kenn mich leider auch nicht all zu gut mit XML aus :oops: jemand eine Idee?
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:UUID>DEMO-UUID</SOAP-ENV:UUID></SOAP-ENV:Header>
Gruß PJM |
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Wie ist es denn so?
Delphi-Quellcode:
function TUUID.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter;
const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode; var KostenstelleIDNode: IXMLNode; UUIDNode: IXMLNode; begin KostenstelleIDNode := ParentNode.AddChild('kostenstelleID'); KostenstelleIDNode.Attributes['type'] := 'kos:kostenstelleID'; UUIDNode := KostenstelleIDNode.AddChild('UUID'); UUIDNode.Attributes['type'] := 'xsi:string'; UUIDNode.Text := UUID; Result := KostenstelleIDNode; end; |
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Dann schaut es so aus:
Code:
Hab immer noch den SOAP-ENV part vorne dran, ist aber schon mal deutlich näher dran :thumb:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:kostenstelleID type="kos:kostenstelleID"><SOAP-ENV:UUID type="xsi:string">DEMO-UUID</SOAP-ENV:UUID></SOAP-ENV:kostenstelleID></SOAP-ENV:Header>
|
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Hast Du in den THttpRio.Converter.Options [soLiteralParams] drin? Standard ist ja nur [soSendMultiRefObj, soRootRefNodesToBody, soTryAllSchema, soCacheMimeResponse, soUTF8EncodeXML]
|
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Zitat:
Problem scheint ja auch noch zu sein, dass die ganze Root-Node schon anders benannt ist ... "SOAP-ENV:Envelope" statt "soapenv:Envelope" ... ich denke die WSDL scheint nicht so recht zu passen ... kannst du (bei der Stelle welche die Nachrichten dann in Empfang nimmt) nachfragen, ob das überhaubt die passende/richtige ist? MfG Incocnito |
AW: SOAP WSDL Import ohne Header - Tokyo 10.2
Hey und willkommen zurück aus dem langen Wochenede :-D
Es läuft :) @Union - Danke für den Parameter, war mir gar nicht bewusst was man alles noch an der Stelle konfigurieren kann, hatte aber tatsächlich keinen Einfluss auf das ganze. Es funktioniert jetzt tatsächlich mit dem POST den ich als letztes rein gestellt hatte. Beim nochmaligen durchgehen der WSDL und der daraus erzeugten Unit/Klassen ist mir aufgefallen, das für diese "UUID" bereits etwas mitimplementiert wurde. Entspricht im Prinzip genau dem was ich vorher über den ObjectToSoap part gelöst hatte, aber warum doppelten Code pflegen? Also weg mit meinerm Krahm :) In der WSDL Unit wird automatisch eine entsprechende Headerklasse generiert und dann mit
Delphi-Quellcode:
"angebunden".InvRegistry.RegisterHeaderClass(TypeInfo(wsKostenstelleObj), wsKostenstelleID, 'wsKostenstelleID', 'virrpcKostenstelle/wsKostenstelle'); InvRegistry.RegisterHeaderClass(TypeInfo(kostenstelleObj), kostenstelleID, 'kostenstelleID', 'virrpcKostenstelle/kostenstelle'); Das Einzige was ich noch machen musste, war mir die UUID und die Anwendungsspeziefischen Fehlermeldungen aus der Responce rausziehen. Das hab ich über das AfterExecute Event des übergebnen tHTTPRIO objekts gelöst.
Delphi-Quellcode:
Die RecursiveFindNode hab ich aus folgendem
procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string; SOAPResponse: TStream);
var lSL: tstringlist; I: Integer; lXMLDoc: IXMLDocument; begin lXMLDoc:= TXMLDocument.Create(nil); lXMLDoc.LoadFromStream(SOAPResponse); SOAPErrorMessage:=RecursiveFindNode(lXMLDOC.DocumentElement,'errorMessage'); case IndexText(MethodName,['Connect_wsKostenstelle','CreatePO_kostenstelle']) of 0: WebserviceUUID:=RecursiveFindNode(lXMLDOC.DocumentElement,'UUID'); 1: CSPortUUID :=RecursiveFindNode(lXMLDOC.DocumentElement,'UUID'); end; end; ![]() Falls jemand sowohl für das RecursiveFindNode als auch den Ansatz die Responce aus dem Event auszulösen was zu meckern hat :) gern immer her damit. Bin immer offen für konstruktive Kritik.:wink: Bis dahin, super vielen Dank für die Hilfe. @Incocnito - Das mit dem > war üübrigens kein Problem, funktioniert ohne Probleme. Vielleicht weils nochmal gekapselt ist in verschiedenen Nodes, aber wie gesagt XML und ich sind nicht die besten Freunde? :) MFG PJM |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz