-
Notifications
You must be signed in to change notification settings - Fork 16
/
responsejsonrpc.gtw
145 lines (104 loc) · 4.42 KB
/
responsejsonrpc.gtw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
~~LANG:EN@enman:responsejsonrpc~~
Jelix propose la prise en charge du protocole [[http://json-rpc.org/|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
[[requests|l'objet request]] "classic". Il vous faut créer un point d'entrée
spécifique dans le répertoire @@F@www/@@, @@F@jsonrpc.php@@ par exemple, qui
utilise @@C@jJsonRpcRequest@@ plutôt que @@C@jClassicRequest@@. Le type de
requête et du point d'entrée est donc "jsonrpc".
Le point d'entrée devra contenir ceci :
<code php>
require_once ('../../myapp/application.init.php');
$config_file = 'jsonrpc/config.ini.php';
require_once (JELIX_LIB_CORE_PATH.'request/jJsonRpcRequest.class.php');
$jelix = new jCoordinator($config_file);
$jelix->process(new jJsonRpcRequest());
</code>
Il ne faut oublier de déclarer ce point d'entrée au niveau de la configuration
des moteurs d'urls simple ou significant. Si vous utilisez
[[/urls/simple|le moteur d'url simple]], vous devez mettre dans la section
//simple_urlengine_entrypoints// de la configuration de jelix la déclaration
suivante :
<code ini>
jsonrpc = "@jsonrpc"
</code>
//jsonrpc// étant le nom du point d'entrée, et //@jsonrpc// indiquant le type de point d'entrée.
Si vous utilisez [[urls/significant|le moteur d'url significant]], vous devez ajouter la balise suivante :
<code xml>
<entrypoint type="jsonrpc" name="jsonrpc" default="true" />
</code>
Dans un cas comme dans l'autre, vous pouvez alors récupérer l'url d'une action
pour jsonrpc comme ceci :
<code php>
$url = jUrl::get("module~action@jsonrpc");
</code>
===== 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 :
<code php>
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;
}
}
</code>
===== Appel depuis le client =====
Qui dit JsonRpc, dit une partie cliente qui envoie une requête jsonrpc. Comme
vous pouvez le lire dans [[http://json-rpc.org/|la spécification de jsonrpc]],
il faut envoyer une chaîne de ce type :
<code>
{ method : "",
id:"",
params: {}
}
</code>
Dans method, vous indiquerez, dans le cas d'un appel à une application jelix, le
sélecteur de l'action à appeler :
<code>
method:"monModule~default:index"
</code>
Les données que vous mettrez dans params seront mises dans le paramètre "params"
dans la réponse. Ainsi, pour les récupérer dans l'action vous ferez :
<code php>
$parametres = $this->param('params');
</code>
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
@@C@jJsonRpcRequest@@..
Notez qu'un script javascript est fourni dans @@F@lib/jelix-www/js/json.js@@. Il
vous permet, dans vos pages HTML de transformer vos données javascript en chaine
json. Pour cela, sur les objets, tableaux et autre type de donnée javascript, il
suffit d'appeler la méthode javascript @@M@toJSONString()@@ qui renvoie une
chaîne. Il suffit ensuite de passer cette chaîne à xmlHttpRequest pour envoyer
la requête JSONRPC à jelix. Exemple, dans votre page HTML :
<code javascript>
var jsonrpc = { method : "monModule~default:index",
id:"1",
params: null
};
var toSend = jsonrpc.toJSONString();
var p = new XMLHttpRequest();
p.onload = null;
p.open("POST", "http://monsite.tld/jsonrpc.php", false);
p.send(toSend);
var reponse = p.responseText.parseJSON();
var resultat = reponse.result;
</code>
Enfin si dans l'action jelix, vous avez fait un
<code php>
$rep->response = "hello";
</code>
Vous aurez alors dans la variable //resultat// de l'exemple javascript, une chaîne "hello".