dissabte, 12 de maig del 2007

XML-RPC -> faultCode faultString

ALERT: NO sé com postejar codi XML, algú m'ajuda???

Se suposa que quan fas una cirda xml-rpc pots retornar una missatge d'error en cas de que no s'obtingui el resultat adequat o els paràmetres de la crida no siguin els que hagin de ser, en fi, que pot retornar errors.
ALERT!!!: NO sé com postejar codi XML si algú ho sap que m'avisi!!!


És per això que es retorna un XML format expressament amb dos paràmetres especials: faultCode i faultString

El format del XML és el següent:






faultCode

2002



faultString

courseList: Login Error







< values =" array('faultCode'"> $number,'faultString' => $string);
return xmlrpc_encode_request(NULL,$values);

I evidentment CAGADA PASTORET:

Al rebre el resultat veia el mateix resultat que a dalt, però el parser rebia el següent:





faultCode 2002 faultString courseList: Login Error





Un XML dintre un altre XML, o sigui que no podia veure on estava el problema ja que la sortida era la mateixa però la resposta del servidor no......

La solució? Doncs ben fàcil:

$values = array('faultCode' => $number,'faultString' => $string);
return $values;

El que passa és que un altre cop he perdut molt de temps per una tonteria on no podia identificar el que passava, cada dia els errors són més obscurs i google, com ja vaig dir uns posts dies endarrere ja no és el que era, i no m'ajuda a trobar documentació per descobrir les possibles errades que cometo.

És per això que he arribat a la següent conclusió: GOOGLE IS EVIL

Etiquetes de comentaris: , ,

dilluns, 30 d’abril del 2007

XML-RPC

Ja he investigat una mica sobre com fer anar el XML-RPC sobre php i python.


Primer de tot farem una mica d'introducció de que és el XML-RPC, com que tampoc és una cosa molt difícil d'entendre el millor que podeu fer és anar a la següent web i llegir una mica.

Anem a la xixa, sobre php farem ús de la llibreria xml-rpc que inclou php5. Aquesta llibreria es basa en una de C, per a més informació podeu consultar la seva web.

He fet un petit exemple de com seria un servidor/client de xml-rpc, en php tindria aquesta pinta:

server.php


function coursesList($method, $params) {
//params[0]
$reply=array("CURS1","CURS2","CURS3","CURS4");
return $reply;
}

$server = xmlrpc_server_create();
xmlrpc_server_register_method($server, "coursesList", "coursesList");

$request = $HTTP_RAW_POST_DATA;

$options = array('output_type' => 'xml',
'verbosity' => 'pretty',
'escaping' => array('markup', 'non-ascii', 'non-print'),
'version' => 'xmlrpc',
'encoding' => 'utf-8');
xmlrpc_server_call_method($server, $request, $response, $options);
if ($response = xmlrpc_server_call_method($server, $request, $response, $options)){
header('Content-Type: text/xml');
echo $response;
}
xmlrpc_server_destroy($server);
?>


client.php



function do_call($host, $port, $request, $path, $agent) {
$fp = fsockopen($host, $port, $errno, $errstr);
$query = "POST ".$path." HTTP/1.0\n User_Agent: ".$agent."\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!fputs($fp, $query, strlen($query))) {
$errstr = "Write error";
return 0;
}

$contents = '';
while (!feof($fp)) {
$contents .= fgets($fp);
}

fclose($fp);
return $contents;
}
$host = 'kuduk.no-ip.org';
$port = 80;
$path = '/xml-rpc/server.php';
$agent = 'OOwiki';
$request = xmlrpc_encode_request('coursesList', 'egg2');
$response = do_call($host, $port, $request, $path, $agent);
$xml=(substr($response, strpos($response, "\r\n\r\n")+4));
$result = xmlrpc_decode ($xml,'utf-8');
print_r($result);
?>
El que faria el client és fer una crida al servidor per a que retornes una llista de cursos ( a falta de tenir la nova API feta doncs ho hardcodejo com un campió) i el client rep la resposta i la transforma en un variable de php.

Ara bé, el client del servidor xml-rpc haurà de ser en python, és per això que també he hagut de cercar informació de com programar xml-rpc sobre pyhton. El resultat ha estat el següent: hi ha una llibreria que també ens facilita molt les coses.

I evidentment el codi del client és una delícia!

client.py

import xmlrpclib

server = xmlrpclib.ServerProxy("http://kuduk.no-ip.org/xml-rpc/server.php")
courses = server.coursesList()
print courses

Conclusió, ara falta que la API estigui enllestida i mirar de si funciona la xmlrpclib amb el pyuno d'OpenOffice.

Aviam amb quins problemes ens trobarem......

Etiquetes de comentaris: ,