Also ich hatte jetzt gerade wieder das Problem, dass mein GSales_Connector (XMLRPC-Schnittstelle zu GSales mit sehr erweitertem Funktionsumfang im Vergleich zur normalen Schnittstelle von GSales) ein wenig herumgezickt hat. Er lieferte Sachen wie folgendes:
Exception: Failed to parse response
~~ /[..]/library/Zend/XmlRpc/Client/ServerProxy.php@93: Zend_XmlRpc_Client->call(string, array)
~~ /[..]/library/GSales/SeriesInvoice.php@144: Zend_XmlRpc_Client_ServerProxy->updateSeriesInvoicePosition(integer, array)
Nun dachte ich mir so, dass ich zum debuggen einfach mail() nutzen könne. Pustekuchen...nicht mal Dateien hat der nette Zend_XmlRpc_Server geschrieben. Aber die Lösung des Problems ist so einfach, wie nützlich...leider kam ich nicht gleich darauf (muss wohl an der Uhrzeit liegen).
Meine Lösung:
- Zum Test einen kleinen Zend_XmlRpc_Client erstellen
- Die "kaputte" Methode im Server mit einem weiteren @return-Typ versehen: string
- in der "kaputten" Methode auf dem Server einfach per return "zeilenweise" die Zwischenergebnisse zurückgeben lassen
- gefundenen Fehler fixen und vóila, alles ist schön
set_include_path('/pfad/zur/zf/library/');
require_once('Zend/Http/Client.php');
require_once('Zend/XmlRpc/Client.php');
require_once('Zend/Debug.php');
require_once('Zend/Http/Client/Exception.php');
$url = 'http://xmlrpc-server.loc/xmlrpc.php';
$username = 'httpauth-user';
$password = 'httpauth-password';
$httpClient = new Zend_Http_Client($url);
$httpClient->setAuth($username, $password);
$client = new Zend_XmlRpc_Client($url, $httpClient);
$proxy = $client->getProxy('module');
$intId = 123;
$arrUpdateData = array(
'bez3' => 'klappt doch mit Ümlauten',
);
$strUpdateData = http_build_query($arrUpdateData);
Zend_Debug::dump($proxy->kaputteMethode($intId, $strUpdateData));
Und hier ist ein Auszug aus der xmlrpc.php vom Server:
/**
* updates anything
* @param int $pid
* @param string $strUpdateData
* @return bool|string
*/
function kaputteMethode($pid, $strUpdateData)
{
parse_str($strUpdateData, $arrUpdateData);
[..]
return print_r($arrUpdateData, true);
}
$server = new Zend_XmlRpc_Server();
$server->addFunction('kaputteMethode', 'module');
echo $server->handle();
Also mir hat das sehr gut geholfen und leider fand ich bisher mit Google nichts dazu. Wer es anders macht oder besser kann, immer her damit! Was mich auch interessieren würde ist, ob ich mit dem Observer oder einer weiteren Exception-Definition per Zend_XmlRpc_Server_Fault etwas ähnliches hätte erreichen können. Ich glaube nicht, weiß es aber nicht so genau. Tags: gsales, php, xmlrpc, zend framework
