# Probleme mit xmlrpc und php



## Huhn (25. Jul 2005)

Hallo Leute!

Ich habe ein Problem mit xmlrpc funktionaufrufen.

Folgendes:

- mein xmlrpc server ist ein php skript, engine stammt von http://keithdevens.com/software/xmlrpc
- xmlrpc client ist eine java umsetzung und benutzt die apache xmlrpc bibliothek 2.0

mein java code, verkürzt auf den Aufruf:


```
Object result = client.execute("xmlrpcfunction", params);
System.err.println(result.getClass().getName()+": "+result.toString());
if(result.getClass().getName().equals("org.apache.xmlrpc.XmlRpcException")) throw new XmlRpcException(((XmlRpcException) result).code,((XmlRpcException) result).getMessage());
```

mein php code, auf includes wurde verzichtet:


```
$xmlrpc_methods["xmlrpcfunction"] = "xmlrpc_exception";

function xmlrpc_exception($params) {
	XMLRPC_error(800,"fehler");
}

$xmlrpc_request = XMLRPC_parse($HTTP_RAW_POST_DATA);
$methodName = XMLRPC_getMethodName($xmlrpc_request);
$params = XMLRPC_getParams($xmlrpc_request);

    #call the method
    $xmlrpc_methods[$methodName]($params);
```

jetzt kommts:

- java liefert mir beim execute ein org.apache.xmlrpc.XmlRpcException Object zurück, was den korreken Fehlercode und Fehlermeldung enthält
- java erzeugt aber *keine* exception
- erst bei der manuellen abfrage wird die exception erzeugt

Kann mir einer sagen wieso das so ist ? woran liegts ? Hat schonmal einer Erfahrungen gemacht mit java - php xmlrpc Aufrufen ?

Ich hab echt kein Idee mehr


----------



## Huhn (25. Jul 2005)

habe das grad nochmal mit der pear xmlrpc implementierung getestet, gleiches Ergebnis. Es wird keine Exception erzeugt.


----------



## Bleiglanz (25. Jul 2005)

- java erzeugt aber keine exception

würde vermuten, dass die Bibliothek eben so ist; d.h. nicht der execute aufruf wirft die Exception, sondern diese wird einfach als Ergebnis geliefert (schau mal in die Doku)

- erst bei der manuellen abfrage wird die exception erzeugt 

wie siehtst du das? was ist der "manuelle" Aufruf??

(wenn das im browser ist, dann wird eben der php fehler direkt angezeigt und nicht vom Framework in eine Java-Exception eingewickelt)


----------



## Huhn (25. Jul 2005)

zu 1. :

http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/XmlRpcClient.html

laut api doc wird da eine IOException oder XmlRpcExcepion erzeugt:

```
public java.lang.Object execute(java.lang.String method,
                                java.util.Vector params)
                         throws XmlRpcException,
                                java.io.IOException
```
zu 2.: 

oben im Code frage ich das Object ab was mir zurückgegeben wird, und erzeuge daraus ne Exception falls es sich eben um das Exception Object handelt. Das meinte ich mit manuellem Aufruf. Diese Zeile sollte normalerweise nie zur Ausführung kommen, die Exception sollte ja schon von der execute Methode kommen, tut sie aber nicht  :shock: 


zu hülfe


----------



## Bleiglanz (25. Jul 2005)

```
Object result = client.execute("xmlrpcfunction", params);
```
Hast du um das ganze ein Try Catch?

Und wenn ja, dann wirfst du aber in

```
if(rif(result.getClass().getName().equals("org.apache.xmlrpc.XmlRpcException")) throw new XmlRpcException
```
einfach eine neue, das wär dann ein klassischer Fehler (das Verschlucken von geworfenen Exceptions??)


----------



## Bleiglanz (25. Jul 2005)

ggf. würde ich auch die Doku beider Frameworks lesen

vielleicht ist die php-Seite da nicht konform mit dem Client und schickt  fälschlicherweise ein Exceptionobjekt zurück


----------



## Huhn (25. Jul 2005)

Bleiglanz hat gesagt.:
			
		

> ```
> Object result = client.execute("xmlrpcfunction", params);
> ```
> Hast du um das ganze ein Try Catch?
> ...



Also ein try - catch block ist an der stelle pflicht,da die von execute erzeugten exceptions ja abgefangen werden müssen, wird von java schon so gefordert bzw. netbeans 
Und da die execute methode die exception erzeugt, dürfte die throw anweisung gar nicht mehr ausgeführt werden, da ja vorher in den catch block gesprungen wird. tut sie aber eben nicht.

im Beispiel oben wird bei mir _immer_ das Object als String ausgegeben (die zeile nach execute), wo ich sehe dass es sich um ein XmlRpcException Object handelt.

Danach checke ich nochmal manuell um welchen Objekt Typ es sich handelt, und erzeuge manuell eine neue XmlRpcException mit den Daten des Objekts, was ich bei der execute Methode zurückbekommen habe. 
Und siehe da, es wird der catch Block aufgerufen, mit der Fehlermeldung und Fehlercode die ich auch im PhP Skript verwendet habe.

Wodurch dieser Effekt entsteht würde ich ja gern mal wissen. Ich habe jetzt auf PhP Seite (Server) schon mit der oben angegebenen Variante und der PEAR::XML_RPC Implementierung versucht, mit jeweils dem gleichen Ergebnis.

Auf Client Seite hab ich bis jetzt nur die Apache XmlRpc Variante probiert, andere bibliotheken hab ich dazu nicht gefunden. Kennt da noch jemand welche ?

Ich könnte auch einfach einen wrapper um die execute Methode baun, der mir eben nochmal manuell die exception erzeugt, aber das kanns ja irgendwie auch nicht sein oder ?


----------



## Huhn (25. Jul 2005)

Hier nochmal die Codeblöcke, mit allem drum und dran:

java client:


```
try {
            XmlRpcClient client = XmlRpcClient("http://localhost/xmlrpctest.php");
            Vector params = new Vector ();
            Object result = client.execute("test.exception", params);
            System.err.println(result.getClass().getName()+": "+result.toString());
            if(result.getClass().getName().equals("org.apache.xmlrpc.XmlRpcException")) throw new XmlRpcException(((XmlRpcException) result).code,((XmlRpcException) result).getMessage());
        } catch(XmlRpcException s) {
            System.err.println("rpc error: "+s.getMessage());
        } catch(IOException i) {
            System.err.println("io error: "+i.getMessage());
        }
```

php server, pear xml_rpc

```
<?php
require_once 'XML/RPC/Server.php';

function testException($params) {
	return new XML_RPC_Response (0, 100, "testfehler");
}

$server = new XML_RPC_Server(
    array(
        'test.exception' =>
            array(
                'function' => 'testException'
            )
    )
);
?>
```

und die Ausgabe:

```
org.apache.xmlrpc.XmlRpcException: org.apache.xmlrpc.XmlRpcException: testfehler
rpc error: testfehler
```


----------



## Bleiglanz (26. Jul 2005)

php gibt ja einfach eine Exception Objekt zurück

die frage ist, wie du in php das "throw" realisieren kannst, gibts da keinen Befehl dafür, steht nix in der Doku?


----------



## Huhn (26. Jul 2005)

Im php code wird eine xmlrpc fehlermeldung generiert und an den client geschickt. Dessen Aufgabe ist es, dieses zu interpretieren. Java sollte aus der xmlrpc fehlermeldung eine Exception erzeugen, was Java offensichtlich nicht tut. Java gibt mir das Exception Object als Ergebnis der execute Methode zurück, und erzeugt keine Exception wie in der Api Doku beschrieben. Sieht nach einem handfesten Bug aus....


----------



## Bleiglanz (26. Jul 2005)

schreib mal ein 

$i = 1/0;

in deiner php-server routine

=> bekommt der java client dann eine exception?


----------



## Huhn (26. Jul 2005)

warum sollte der java client da eine exception bekommen ?

Wenn du nicht weisst wie xmlrpc funktioniert, empfehle ich dir mal dich amit zu beschäftigen: http://www.xml-rpc.de/spec/index.xhtml


----------



## Bleiglanz (27. Jul 2005)

Na gut, dann machs eben alleine wenn du dich so toll auskennst

War ja nur ein versuch, hätte mich auch gewundert wenn das so clever gewesen wäre (in Java ist das normal: am Server fliegt Exception, die wird aufgefangen und schön in eine Fault-Message für den Client verpackt...)

Das Problem ist eben wie du am Server solche erzeugst, d.h. wie organsiert deine PHP Library die Erzeugung eines "faults"


```
<methodResponse>
   <fault>
      <value>
         usw.
```
das sollte eingentlich von

XMLRPC_error

generiert werden, aber wenn du lieber "als Antwort" ein Exception Objekt schickst (das ja dann gar kein Fehler ist) na gut


----------



## Huhn (27. Jul 2005)

Bleiglanz hat gesagt.:
			
		

> Na gut, dann machs eben alleine wenn du dich so toll auskennst
> 
> War ja nur ein versuch, hätte mich auch gewundert wenn das so clever gewesen wäre (in Java ist das normal: am Server fliegt Exception, die wird aufgefangen und schön in eine Fault-Message für den Client verpackt...)
> 
> ...



ich schicke keine exception, sondern ein xmlrpc_error paket. Von java wird das interpretiert und daraus eine exception erzeugt.

Man kann als Antwort keine Exception schicken, sondern nur xml pakete.


----------

