SOAP oder was?



  • ich müsste in erster linie wissen wie ich ein objekt (C++ klasse) instanziiert an den server kriege 🙂 geht sowas denn mit SOAP? wohl eher nicht so ganz ohne umwege oder?



  • Die Daten solltest Du schon rüberkriegen. Er bildet das C++-Objekt in ein XML-Dokument ab, überträgt es und der php-SOAP-Client baut die Daten dann wieder auf. Früher war das ein assoziatives (und möglicherweise verschachteltes) Array in PHP, ob das jetzt als php-Objekt gehandelt wird weiss ich nicht.



  • okay danke 😉



  • Ja, so Datenobjekte sind kein Problem. Das ist sogar sozusagen der beste Weg sowas zu machen: Also nicht Funktionen die ganz viele einzelne Parameter erwarten, sondern lieber Funktionen die ein Input-Objekt und ein Output-Objekt (je nachdem halt) haben.
    Wichtig ist eben, dass du dir bewusst sein musst, dass du eben nur die Daten an sich übertragen kannst, d.h. du kannst keine Zeiger oder Referenzen übertragen. Du kannst auch nicht irgendwelche Methoden/Funktionen auf übertragenen Objekten aufrufen, das sind eben wie gesagt nur Daten.



  • mir ist aber irgendwie nicht ganz klar wie ich die WSDL datei dafür fit mache, das ich ein sollches objekt erwarte und speziell auch als rückgabewert empfangen kann. habe schon versucht die klasse bzw. das struct in php zu redeklarieren und es als parameter erwarte. in der WSDL datei, die automatisch generiert wird, ist die definition dann als string.

    wie genau mache ich php klar, dass ich ein C++ struct erwarte und keinen string? sicherlich müsste man es so verstehen, das im endeffekt eine ansammlung an datentypen erwartet wird. also integer, strings, chars, floats, usw. für die korrekte verarbeitung würde man dann unter C++ ja mit den variablen namen arbeiten, also die adressierung dessen dann. das kann man ja logischerweise nicht als sollches dann übertragen.

    mir ist einfach nicht klar wie ich wort wörtlich ein objekt erwarte und senden kann, was exakt die datentypen und variablen namen dann enthält wie sie deklariert wurden.



  • webby23 schrieb:

    mir ist einfach nicht klar wie ich wort wörtlich ein objekt erwarte und senden kann, was exakt die datentypen und variablen namen dann enthält wie sie deklariert wurden.

    Gar nicht, dazu ist SOAP nicht gedacht. Und es wäre auch unnötig und umständlich, sowas zu implementieren. Du musst dir ein abstraktes Design überlegen, wie du nackte Daten abfragst und weiterverwendest. SOAP bietet dir lediglich einen Standard an, um sowas einfacher zu handhaben (die Daten im XML-Stil zu verschachteln usw.), mehr aber auch nicht.

    Gruß



  • @webby:

    In der WSDL werden solche Objekte mittels XML-Schemata beschrieben (complexType usw.). Bei den dort beschriebenen Methoden kann man sowas dann auch als Rückgabetyp angeben. Frag mich jetzt aber nicht wie das da genau geht. Weiß ich nicht auswendig, aber dazu gibts tausend Tutorials wie das beschrieben ist (Stichwort: WSDL, XML-Schema).
    Normal machst du sowas aber auch nicht von Hand, sondern lässt dir das alles generieren, ausgehend von dem WebService-Framework das du verwendest.



  • vielen dank auch allen. habe es nun soweit das ich eine klasse verwenden kann und ein objekt davon an den server senden kann. ich glaube das abstrakte design was Borschtsch beschreibt, trifft es.

    jetzt muss ich nur noch rausfinden wie php wohl DynamicArray (C++ Builder) implementiert, damit ich anständig MySQL results empfangen kann. auf jedenfall vielen dank schonmal.



  • ich scheitere leider an dem richtigen php syntax um dem interface klar zu machen welche RTTI benötigt wird. ich gebe mal ein wenig C++ code:

    //---------------------------------------------------------------------------
    class Files
    {
    	public:
    		String filename;
    		String file_description;
    		String path;
    
    	private:
    };
    //---------------------------------------------------------------------------
    class MainData : public TRemotable
    {
    	private:
    		String Ftitle;
    		/*
    
    			natürlich viele weitere klassen-attribute. zwecks übersichtlichkeit
    			wurden diese aber entfernt.
    
    		*/
    		DynamicArray<Files*> FImages;
    
    	public:
    		__published:
    		__property String title = {read=Ftitle, write=Ftitle};
    		__property DynamicArray<Files*> Images = {read=FImages, write=FImages};
    };
    //---------------------------------------------------------------------------
    namespace NS_SOAP
    {
    	__interface INTERFACE_UUID("{03D0FB5E-9936-8D9A-C0AD-868A33063A7A}") SoapServicePort : public IInvokable
    	{
    		public:
    			virtual DynamicArray<MainData*> GetMainData() = 0;
    	};
    
    	typedef DelphiInterface<SoapServicePort> _di_SoapServicePort;
    	_di_SoapServicePort GetSoapServicePort();
    };
    //---------------------------------------------------------------------------
    

    beim empfang der main daten klappt alles wunderbar. ich kann dann über DynObjekt[n]->mysql_feld1; zugreifen. das problem stellt nun aber DynamicArray<Files> Images* dar. ich erhalte den fehler element des Array-Types DynamicArray<Files*> Images hat keine RTTI Informationen. bei der php seite sieht das inetwa so aus:

    function GetMainData()
    		{
    			$db = mysql_connect("localhost", "xxxxx", "xxxxx");
    			mysql_select_db("xxxxxx", $db);
    			$result = mysql_query("SELECT * FROM xxxxx WHERE 1", $db);
    
    			while($data = mysql_fetch_object($result))
    			{
    				$images = mysql_query("SELECT * FROM xxxxx WHERE xxxxx = '" . $data->xxxxx . "'", $db);
    
    				/* HIER WERDEN DIE DIE ZEILEN ALS OBJEKT IN EINEM ARRAY ABGELEGT
    				   DAS KLAPPT WUNDERBAR UND FUNKTIONIERT AUF DER APPLICATION SEITE 
    				   OHNE PROBLEME, SPRICH, DIE DATEN SIND DEN VARIABLEN VON KLASSE 
    				   MAINDATA KORREKT ZUGEWIESEN
    				*/
    				$main_data[] = $data;
    
    				/* HIER SCHEITERT ES NUN! ICH WEISS EINFACH NICHT, WIE ICH DEN SYNTAX 
    				   SCHREIBEN MUSS, DAMIT DAS APPLICATION INTERFACE DIE KORREKTEN RTTI 
    				   INFORMATIONEN BEKOMMT, UM ZU WISSEN DAS:
    
    				   DynamicArray<Files*> Images
    
    				   GEMEINT IST. UND SOMIT DAS DYNAMISCHE ARRAY VERWENDET WERDEN SOLL.
    				*/
    				while($image = mysql_fetch_object($images))
    				{
    					$main_data[0]['Files'] = array("Images" => $image);
    				}
    				break;
    			}
    			return  $main_data;
    		}
    

    ich hoffe ihr könnt mir da weiterhelfen.



  • hat sich erledigt, es klappt nun. habe die klasse Files nicht im VCL stil designt und deswegen konnten keine RTTI informationen erzeugt werden. die aktualisierte verschachtelte while-schleife sieht wie folgt aus, falls jemand das gleiche problem hat:

    $main_data[] = $data;
    				while($image = mysql_fetch_object($images))
    				{
    					$main_data[$i]->Images[] = $image;
    				}
    

Anmelden zum Antworten