− Table des matières
Jelix propose la prise en charge du protocole json-rpc. Ce protocole d'échange est similaire à XML-RPC dans le fonctionnement, mais utilise JSON comme format de donnée au lieu de XML (RPC = Remote Procedure Call).
Point d'entrée spécifique ¶
Une requête JSON-RPC est spécifique, et pour y répondre, on ne peut pas utiliser
l'objet request "classic". Il vous faut créer un
point d'entrée spécifique dans le répertoire www/
, jsonrpc.php
par
exemple, qui utilise jJsonRpcRequest
plutôt que jClassicRequest
. Le
type de requête et du point d'entrée est donc "jsonrpc".
Utilisez la commande app:create-entrypoint
, en indiquant le type jsonrpc
:
php dev.php app:create-entrypoint --type=jsonrpc jsonrpc.php
Cela créera un point d'entrée jsonrpc.php
dans www/
, et le déclarera
dans urls.xml
et framework.ini.php
.
Vous pouvez alors récupérer l'url d'une action pour jsonrpc comme ceci :
$url = jUrl::get("module~action@jsonrpc");
Contrôleur ¶
Comme on a affaire à un type de requête particulier, le nom du fichier du contrôleur doit avoir le suffixe ".jsonrpc.php". Par exemple, un contrôleur "default" : "default.jsonrpc.php". (Vous pouvez bien sûr avoir un autre contrôleur "default" pour d'autres types de requêtes, "default.classic.php" par exemple).
Ensuite, le contenu du contrôleur est similaire à ce que vous avez l'habitude de
faire, à la seule différence que vous utiliserez jResponseJsonRpc
, qui a
pour alias "jsonrpc", pour répondre aux requêtes JsonRpc :
class defaultCtrl extends jController {
function index(){
$rep = $this->getResponse('jsonrpc');
// n'importe quelles types de données : entier, chaine, array, objets...
$donnees_php = ... ;
$rep->response = $donnees_php;
return $rep;
}
}
Appel depuis le client ¶
Qui dit JsonRpc, dit une partie cliente qui envoie une requête jsonrpc. Comme vous pouvez le lire dans la spécification de jsonrpc, il faut envoyer une chaîne de ce type :
{
method : "",
id:"",
params: {}
}
Dans method
, dans le cas d'un appel à une application jelix, vous indiquerez le
sélecteur de l'action à appeler :
method:"monModule~default:index"
Les données que vous mettrez dans params
seront mises dans le paramètre params
de la réponse. Ainsi, pour les récupérer dans l'action vous ferez :
$parametres = $this->param('params');
Bien entendu, ce que vous avez dans $parametres sera des données "php" (chaine,
array ou autre), la transformation de la chaine json étant réalisée par
jJsonRpcRequest
..
Dans vos pages HTML, il faut transformer vos données javascript en chaine
json. Pour cela, vous devez utiliser l'objet JSON
présent dans tout bon
navigateur, et appeler sa méthode stringify
, qui renvoi la chaîne au format JSON.
Il suffit ensuite de passer cette chaîne à xmlHttpRequest pour envoyer
la requête JSONRPC à jelix. Et inversement, pour utiliser la réponse RPC en
javascript, il faut utiliser JSON.parse()
.
Exemple, dans votre page HTML :
// le message JSONRPC
var jsonrpc = { method : "monModule~default:index",
id:"1",
params: null
};
var toSend = JSON.stringify(jsonrpc);
var p = new XMLHttpRequest();
p.onload = null;
p.open("POST", "http://monsite.tld/jsonrpc.php", false);
p.send(toSend);
// récupération de la réponse
var reponse = JSON.parse(p.responseText);
var resultat = reponse.result;
Enfin si dans l'action jelix, vous avez fait un
$rep->response = "hello";
Vous aurez alors dans la variable resultat
de l'exemple javascript, une chaîne "hello"
.