Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi SOAP, WSDL und Arrays (https://www.delphipraxis.net/208587-soap-wsdl-und-arrays.html)

BensonIT 20. Aug 2021 19:54

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

TiGü 23. Aug 2021 10:24

AW: SOAP, WSDL und Arrays
 
Hallo Falko,

hast du die WSDL in Delphi importiert, um die den passenden Quelltext generieren zu lassen?

Siehe:
https://www.youtube.com/watch?v=PLOfjr0ocHQ
https://docwiki.embarcadero.com/RADS...en_WSDL-Import

BensonIT 23. Aug 2021 22:48

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).

generic 24. Aug 2021 00:15

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.

TiGü 24. Aug 2021 08:20

AW: SOAP, WSDL und Arrays
 
Zitat:

Zitat von BensonIT (Beitrag 1493838)
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).

Deine procedure fliegt einfach lose herum. Du musst sie zu einem Bestandteil einer lebenden Klasseninstanz machen.
Siehe auch die Definition von TBeforeExecuteEvent in der Unit Soap.Rio:

Delphi-Quellcode:
TBeforeExecuteEvent = procedure(const MethodName: string; SOAPRequest: TStream) of object;

Union 24. Aug 2021 13:58

AW: SOAP, WSDL und Arrays
 
Erstelle Dir einen eigenen ObjectConverter (TOPSOAPtoDomConvert) der das xml generiert.

Papaschlumpf73 24. Aug 2021 17:36

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:
WS:=[die_erstellte_pas-Datei_aus_der_wsdl].Get[wieauchimmer](false, [hierdieAufrufAdresse], HTTPRIO1);
Dann über den Opbjektinspektor das OnBeforeExecute-Ereignis von HTTPRIO1 erzeugen und folgenden Eintrag machen:
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;

BensonIT 26. Aug 2021 22:38

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 07:43 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