![]() |
Webservice und Webservice-Client (SOAP)
Hallo Community!
Ich habe mir mit Hilfe geigneter Tutorials einen Webservice (SOAP-Server-Anwendung) und einen Webservice-Client (normale VCL-win32-Anwendung mit WSDL-Import) erstellt. Die WSDL-Datei scheint ja ein Überträger der in der SOAP-Server-Anwendung definierten Klassen und Prozeduren zu sein, was schonmal verdammt cool ist! Ich habe aber einige (Beginner-)Fragen dazu: 1.) Wie kann ich nun zwischen Server und Client kommunizieren? 1.1.) Wie kann ich Dateien zwischen Server und Client hin und her schicken? Brauch ich dazu zusätzliche Komponenten wie beispielsweise idTCPClient und idTCPServer oder geht das schon so? 2.) Wie kann ich den WSDL-Import automatisieren? Dass ich irgendwie die URL oder den Pfad angebe und sie über Quellcode importiere. 3.) Wo finde ich geeignete Tutorials zum Thema? Also solche, die ein wenig über die blose Generierung eines Webservice(-Clients) hinausgehen. 4.) Hat das Steuerelement SOAPConnection mit der Thematik zu tun und wenn ja, was? Die wurde in dem Tutorial, dass ich gelesen habe, weder erwähnt noch verwendet. Vielen Dank! mfg Frank |
Re: Webservice und Webservice-Client (SOAP)
Ich habe soeben mal versucht, den Client woanders laufen zu lassen, da meckert er rum, dass er die .WSDL-Datei nicht findet.
Wieso braucht er die denn noch, nachdem ich die importiert habe und mir somit alle Funktionen und Prozeduren des Servers zur Verfügung stehen?? |
Re: Webservice und Webservice-Client (SOAP)
Ich habe jetzt folgenden Code in eine onButtonClick-Procedure geschrieben:
Delphi-Quellcode:
Die auskommentierten Zeilen sind dabei z.z. noch nicht relevant.
procedure TForm1.Button2Click(Sender: TObject);
var muhrio:THTTPRio; muhrr:THTTPReqResp; ms:TMemoryStream; begin ms:=TMemoryStream.Create; ms.LoadFromFile('H:\Archiv\Src\blub.doc'); muhrio:=THTTPRio.Create(nil); muhrio.wsdllocation:='C:\Users\tmsschac\Desktop\ITestService.wsdl'; muhrr:=THTTPReqResp.Create(nil); muhrio.HTTPWebNode:=muhrr; muhrr.URL:='http://localhost:8081/Project1.MyClass'; // muhrr.UserName:=''; // muhrr.Password:=''; muhrr.Connect(true); muhrr.Send(ms); // muhrr.receive(int, stream, boolean); muhrr.Connect(false); end; Das ReqResp-Objekt bietet die Möglichkeit, Streams zu senden. Der Sinn ist glaube ich, dass man Username und Password und nen Request sendet, damit man sich einloggen und die vom Server bereitgestellten Funktionen benutzen kann und der Server schickt dann ein Response. Ich will hingegen eine Datei in dem Stream schicken, die der Server dann irgendwo abspeichern soll. Ich habe bisher leider keine andere Möglichkeit gefunden, überhaupt einen Stream zum Server zu schicken, daher versuche ich das nun auf diese Weise in der Hoffnung, dass es möglich ist. Wenn ich auf den Button drauf klicke, läuft er den code auch durch, ohne einen Fehler zu bringen, d.h. mein Stream mit der Datei drin kommt beim Server an. Nun meine Frage dazu: Wo kommt der Stream an? ^^ Ich weiß, dass ich auf dem Server Funktionen, Prozeduren, Klassen etc definieren kann, die dem Client dann über die WSDL-Datei zur Verfügung gestellt werden. Aber ich habe keine Ahnung, wo genau mein Stream ankommt und ich eine Prozedur schreiben kann, die diesen dann verarbeitet. Ich hoffe, dass das nicht irgendwo automatisch passiert und ich keine Möglichkeit habe, dieses Vorgehen zu verändern... P.S.: Ich weiß, dass dies ein sehr spezielles Themengebiet ist, ich habe auch schon viele Threads gefunden, wo niemals jemand geantwortet hat, aber kennt sich nicht doch der ein oder andere zumindest ein klein wenig aus? Pseudo-Wissen oder Vermutungen sind immernoch besser als gar keine Idee... edit: Ich habe es jetzt mal ganz trivial versucht, indem ich eine function geschrieben habe, die als übergabeparameter einen TMemoryStream hat. In diesen Stream lad ich ich die Datei rein und wollt sie auf der Serverseite wieder als Datei speichern. Beim Import der wsdl meckert er aber rum: Fehlender <definition>-Knoten von Namespace "http://schemas.xmlsoap.org/wsdl/" Hat irgendwer irgendne Idee? Ich nehme an, er kennt kein TMemoryStream. Ich hab aber bei Uses Classes angegeben, da is TMemoryStream ja drin... Kennt XML evtl kein TMemoryStream? Mit XML kenn ich mich ncih so gut aus... |
Re: Webservice und Webservice-Client (SOAP)
Ich bin mal so frei, die "Lösung" hier zum Besten zu geben:
Und zwar kann man mit SOAP nur strukturierte Daten senden, Binärdaten nicht. D.h. nachdem man die Datei in einen Stream geladen hat, kann man diesen nicht direkt verschicken, sondern muss ihn zunächst in einen Base64String umwandeln. Dieser String kann dann als Übergabeparameter für eine auf dem Server deklarierte (und über wsdl-Datei dem Client zur Verfügung gestellte) function/procedure übergeben werden. Da diese function/procedure auf dem Server ausgeführt wird, kann man dort eine TMemoryString-Variable einführen (das geht nämlich, nur als Übergabeparameter geht es nicht) und unter Verwendung anderer Funktionen den Base64String umwandeln und den MemoryStream schließlich als Datei abspeichern.
Delphi-Quellcode:
procedure TTestService.FileReceiver(s:string); stdcall;
var ms:TMemoryStream; begin ms:=TMemoryStream.Create; ms:=Base64toStream(s); ms.SaveToFile(..); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz