# Objekte senden zwischen Java und PHP mit SOAP



## micro (1. Jun 2005)

Hallo,

ich fange gerade an mich mit SOAP zubeschäftigen. Da ich keine Ahnung von Java Servlets habe und mir auch kein Webserver mit Servletunterstützung zur Verfügung steht, läuft mein SOAP-Server mit PHP. Das klappt auch wunderbar mit primitiven Datentypen, aber wie sieht es aus wenn ich Objekte zwischen beiden Sprachen verschicken will?
Ist das überhaupt möglich?

also wenn ich zum Beispiel diese Klasse verschicken will?

Java:

```
public class IntContainer{
	
	public int a;
	public int b;
	  
	public IntContainer(int a, int b){
	    
	    this.a = a;
	    this.b = b;
	}	  
}
```
PHP:

```
class IntContainer{

  public $a;
  public $b;
  
  function __construct($a, $b){
    
    $this->a = $a;
    $this->b = $b;
  }  
}
```

Vielen Dank für eure Antworten,
Gruß,
Ming


----------



## Bleiglanz (1. Jun 2005)

einen soap body definieren (z.B. als XML Element)

von "hand" die soap bodys parsen und entsprechenende objekte draus basteln (hin und zurück)

nennt man marshalling

genau dafür gibts die diversen toolkits (Axis usw.)


----------



## micro (1. Jun 2005)

Also ich übergebe der Methode die ich aufrufe statt z.B. einem IntContainer-Objekt einen String in der Art "<IntContainer a="30" b="20" />" und übersetze den dann mit PHP in ein IntContainer-Objekt?

Und wie ist mir z.B. Axis bei der Angelegenheit nützlich?Hab schon mal rumgegooglet aber leider nicks gefunden?Würde Axis das marshalling mehr oder weniger für mich übernehmen?


----------



## Anselmus (2. Jun 2005)

mit jax-rpc (in axis) kannst du nur objekte übergeben, die primitive datentypen enthalten. außerdem dürfen die übergebenen objekte nur get und set methoden haben...

du kannst zwar auch objekte übergeben die andere objekte enthalten, aber am ende muß es auf primitive datentypen hinauslaufen...

habs grade nochmal ausprobiert. das mit dem konstruktor wird auch nicht hinhauen. da geht nur default konstruktor


----------



## Bleiglanz (2. Jun 2005)

sinn und zweck eines toolkits ists, den soap body KOMPLETT vor dem Programmierer zu verstecken

oft gibts tools folgender art:

wsdl2java (macht aus einer wsdl einen haufen java klassen)
--- benutzt für den client, der einfach eine java methode aufruft


java2wsdl (macht z.B. aus einem Interface ein wsdl)
--- benutzt für den endpoint, das framework reicht die daten dann durch

das ganze hin- und herwandeln von xml-soap zu java-daten wird dann vom framework übernommen (=marshalling), als Programmierer siehst du vom xml nichts mehr

etwas in der art sollte es eigentlich auch für php geben...


----------



## AlArenal (2. Jun 2005)

Also ich arbeite seit nem Jahr mit XML-RPC, ebenfalls in der Kombination PHP aufm Server und Java aufm Client. Ist im Grunde dasselbe. Man muss seine Daten in Strings, ints, booleans, floats und structs verpacken. Das haut eigentlich gut hin. Nutze auf PHP-Seite PEAR::XML_RPC und Java-Seite Apache XML-RPC.

XML hab ich nur mal ganz am Anfang beim Debuggen zu Gesicht bekommen, als ich den Datenverkehr abgehört habe. Dem Protokoll ist es egal in welcher Sprache Client und Server geschrieben sind.


----------



## Micro (2. Jun 2005)

Also erstma vielen Dank für die Antworten!



> mit jax-rpc (in axis) kannst du nur objekte übergeben, die primitive datentypen enthalten. außerdem dürfen die übergebenen objekte nur get und set methoden haben...



Mein Ziel ist eigentlich das ich einen Baum aus Objekten übergeben und auslesen kann. Das die Objekte nur Set- und Get-Methoden haben können wäre kein Problem, aber ein Objekt muss mehrere Unterobjekte haben können, also müsste ein Objekt die Unterobjekte als Array speichern können. Gänge das auch?

Kennst du ein Tutorial oder Beispiel zu jax-rpc mit Objekten zum anschauen?

Wäre ich vielleicht mit XML-RPC besser bedient oder würde das keinen Unterschied machen?


----------



## Guest (3. Jun 2005)

Also ich hab unter blog.thinkphp.de/archives/9-PHP-soap-server-and-dotNet-c-client-Torturial-part-1-Nested-Arrays.html ein gutes Tutorial über komplexere Strukturen in Soap gefunden. Das wird mir erstma weiterhelfen denke ich.


----------



## AlArenal (3. Jun 2005)

Ich benutze XML-RPC auch um letzten Endes Baumstrukturen darzustellen. Allerdings wird die Struktur als solche erst im Client aufgebaut. Ich hole mir eine Liste mit meinen Datensätzen vom Server und habe in jedem Datensatz u.a. die ID des parents. Damit baue ich mir über nen Stack mit etwas Rekursion meine Datenstruktur. 

Ich sehe nicht welchen Vorteil ich hätte schon serv erseitig eine komplette Baumstruktur aufzubauen und diese zu verschicken. Den kniffeligen Teil mache ich auch lieber in Java als in PHP.


----------



## Guest (3. Jun 2005)

Ja, das stimmt. Hab auch schon dran gedacht das ganze als NestedSet zu verschicken, aber da hatte ich es noch nich mal geschafft nen Array zuverschicken.
Und wenn es jetzt auch so geht kann ich das hin- und herbasteln mit PHP und Java sparen.

Habs jetzt so gemacht und es geht einwandfrei : 


```
<types>
        <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Service">
            <xsd:complexType name="IntContainer">
                <xsd:all>
                    <xsd:element name="a" type="xsd:int" />
                    <xsd:element name="b" type="xsd:int" />
                    <xsd:element name="cons" ref="soapenc:arrayType" wsdl:arrayType="typens:IntContainer[]"/>
                </xsd:all>
            </xsd:complexType>
            <xsd:complexType name="IntContainers">
                <xsd:complexContent>
                    <xsd:restriction base="soapenc:Array">
                        <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:IntContainer[]"/>
                    </xsd:restriction>
                </xsd:complexContent>
            </xsd:complexType>
        </xsd:schema>
    </types>
```


----------

