![]() |
SOAP, WSDL und Arrays
Hallo,
ich bin gerade dabei eine Delphi Anwendung gegen einen Web-Service zu programmieren. XML ist mir nicht ganz unbekannt, ich würde mich jedoch nicht als XML Profi, vor allem bei den Schemas, bezeichnen. Problembeschreibung: Entwicklungsumgebung ist Delphi 10.4.2. Ich habe die WSDL Informationen vom Web-Service abgerufen, und kann diesen grundsätzlich auch bedienen. An einer Stelle muss ich dem Web-Service eine Liste von GUIDs (in diesem Fall vom Typ String) übergeben. Die Definition im WSDL sieht so aus: guid = type string; { "http://schemas.microsoft.com/2003/10/Serialization/"[GblSmpl] } ArrayOfguid = array of guid; { "http://schemas.microsoft.com/2003/10/Serialization/Arrays"[GblCplx] } Ich definiere also eine Variable vom Typ ArrayOfguid und baue dort das Array in der Anwendung so auf: sGuid := '00000000-0000-0000-0000-000000000001'; setlength(aContentIDs, 1); aContentIDs[0] := sGuid; Das Ergebnis was per SOAP an den Web-Service zurückgegeben wird sieht so aus: <ContentIDs> <guid>00000000-0000-0000-0000-000000000001</guid> </ContentIDs> Der Web-Service erwartet jedoch die Übergabe des Arrays in folgendem Format: <ContentIDs> <a:guid>00000000-0000-0000-0000-000000000001</a:guid> </ContentIDs> Wie bekomme ich es jetzt aber hin, dass das "a:" vor die "guid" gesetzt wird? Vielen Dank und Grüße, Falko |
AW: SOAP, WSDL und Arrays
Hallo Falko,
hast du die WSDL in Delphi importiert, um die den passenden Quelltext generieren zu lassen? Siehe: ![]() ![]() |
AW: SOAP, WSDL und Arrays
Ja, ich habe die WSDL über den Import-Wizard von Delphi erstellen lassen. Den Web-Service kann ich generell auch ansteuern, nur bei den Arrays scheint Delphi keine Namespaces einzusetzen - der in C# geschriebene Web-Service erwartet diese aber zwingend.
Nun versuche ich gerade einen OnBeforeExecute Event beim HTTPRIO einzubinden, damit ich den Request anpassen kann. Dabei lässt sich aber meine neue Prozedur nicht dem Ereignis zuweisen (inkompatible Typen Methodenanzeiger vs. reguläre Prozedur). |
AW: SOAP, WSDL und Arrays
Ganz notfalls kannst du die WSDL mit SOAPUI einlesen und dir dort ein XML generieren lassen. Dieses nimmst du dann einfach ins Delphi.
|
AW: SOAP, WSDL und Arrays
Zitat:
Siehe auch die Definition von TBeforeExecuteEvent in der Unit Soap.Rio:
Delphi-Quellcode:
TBeforeExecuteEvent = procedure(const MethodName: string; SOAPRequest: TStream) of object;
|
AW: SOAP, WSDL und Arrays
Erstelle Dir einen eigenen ObjectConverter (TOPSOAPtoDomConvert) der das xml generiert.
|
AW: SOAP, WSDL und Arrays
So richtig kann ich das Problem nicht erkennen: Wenn die WSDL importiert wurde, wird eine .pas-Datei erzeugt. Die kommt in die uses-Klausel. Dann den WebService über einen HTTPRIO-Verbinden - etwa so:
Delphi-Quellcode:
Dann über den Opbjektinspektor das OnBeforeExecute-Ereignis von HTTPRIO1 erzeugen und folgenden Eintrag machen:
WS:=[die_erstellte_pas-Datei_aus_der_wsdl].Get[wieauchimmer](false, [hierdieAufrufAdresse], HTTPRIO1);
Delphi-Quellcode:
procedure xxx.HTTPRIO1.BeforeExecute(const MethodName: string; SOAPRequest: TStream);
begin with TStringList.Create do try SOAPRequest.Position:=0; LoadFromStream(SOAPRequest, TEncoding.UTF8); Text:= //hier den Text beliebig manipulieren Text:= //z.B. Text:=StringReplace(Text, '<guid>', '<a:guid>', [rfReplaceAll]); SOAPRequest.Position:=0; SOAPRequest.Size:=0; SaveToStream(SOAPRequest, TEncoding.UTF8); finally Free; end; end; |
AW: SOAP, WSDL und Arrays
Super, die Klasseninstanz war das richtige Stichwort.
Vielen lieben Dank euch allen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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