- 1
[Opened] générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by zitoun on 08/08/2011 18:59
Bonsoir,
Je cherche a renvoyer une erreur en JSON-RPC à l'aide de la méthode: $gJCoord->handleError('error', 42001, 'ERREUR', null, null, null);
Cependant le résultat de cette méthode change le type de réponse en jResponseBasicHtml, et donc l'appel à jResponseJsonRpc->outputErrors() n'est jamais fait.
Est-ce une anomalie dans jCoordinator ou est-ce que la méthode utilisée n'est pas la bonne ?
Merci d'avance pour votre support.
Cordialement,
Olivier
[Opened] générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by laurentj on 08/08/2011 22:00
Bonjour,
En premier lieu, si tu veux générer une erreur, génère une erreur de manière traditionnelle (trigger_error ou une exception). La méthode handleError est "interne".
Ensuite, si tu veux faire du JSON-RPC, normalement, tu dois utiliser un objet request de type json-rpc, qui traite les paramètres en entrée de manière transparente. En clair, tu dois avoir un point d'entrée spécifique pour le protocole json-rpc, et des actions spécifiques. Du coup, Jelix saura que la réponse (normal ou en erreur) doit obligatoirement être en JSON-RPC.
Tu ne peux pas générer du JSON-RPC si en entrée tu n'a pas de JSON-RPC, ce n'est pas logique.
Voir la doc.
(ne pas confondre JSON et JSON-RPC).
[Opened] Re: générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by zitoun on 08/08/2011 22:43
Bonsoir,
Merci de ta réponse.
Concernant le point sur le type de request, j'utilise effectivement une réponse de type json-rpc, dans un point d'entrée dédié (comme sur la doc):
$jelix->process(new jJsonRpcRequest());
Le controller est bien spécifique à ce type de réponse aussi: dispatcher.json.php
Et la méthode de ce controller génère bien une réponse de type jsonrpc:
$rep = $this->getResponse('jsonrpc'); [[...]] trigger_error("erreur", E_USER_ERROR); return $rep;
Comme indiqué sur le code ci-dessus, j'ai changé l'appel de la méthode $gJCoord->handleError par un trigger_error(); (merci :) )
Cepedant la réponse est tjs de type jResponseBasicHtml:
<!DOCTYPE html> <html> <head> <title>Application Error</title> </head> <body> <p>Error 500. A technical error has occured. Sorry for this trouble.</p> </body> </html>
En creusant dans le jCoordinator, la méthode handleError est bien celle qui me retourne la réponse html (changement de réponse dans cette condition : ligne 316) en lieu et place de json-rpc:
else if (isset($_SERVER[['HTTP_ACCEPT']]) && strstr($_SERVER[['HTTP_ACCEPT']],'text/html')) { <code> require_once(JELIX_LIB_CORE_PATH.'response/jResponseBasicHtml.class.php'); $resp = $this->response = new jResponseBasicHtml();
}
</code>Merci de ton aide.
Cordialement,
Olivier
[Opened] Re: générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by zitoun on 08/10/2011 10:31
Bonjour,
Quelqu'un aurait-il la solution pour que je puisse renvoyer une erreur dans le format du protocole json-rpc, tel que décrit dans la spécification ?
Je pense avoir bien respecté la documentation Jelix à cet effet, mais sans pouvoir arriver à mes fins.
Merci d'avance.
Olivier
[Opened] générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by laurentj on 08/10/2011 13:37
Il y a un bug effectivement dans la nouvelle gestion des erreurs. Pour l'instant, il n'y a rien à faire d'autre qu'attendre que ce soit corrigé.
[Opened] Re: générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by zitoun on 08/10/2011 14:30
Ok merci. Le contournement que j'ai fait est le suivant: déplacement du bloc elseif avant celui emettant la réponse basicHTML.
<code> // fatal error, we should output errors if ($this->request->isAjax()) { if ($this->response) $resp = $this->response; else { require_once(JELIX_LIB_CORE_PATH.'response/jResponseText.class.php'); $resp = new jResponseText(); } }
/* PATCH: Bloc elseif déplacé ici */
elseif($this->response) { $resp = $this->response; } else if (isset($_SERVER['HTTP_ACCEPT']) && strstr($_SERVER['HTTP_ACCEPT'],'text/html')) { require_once(JELIX_LIB_CORE_PATH.'response/jResponseBasicHtml.class.php'); $resp = $this->response = new jResponseBasicHtml(); }
/* PATCH: Initialement placé ici */
else { try { $this->initDefaultResponseOfRequest(true); } catch(Exception $e) { require_once(JELIX_LIB_CORE_PATH.'response/jResponseBasicHtml.class.php'); $this->response = new jResponseBasicHtml(); } $resp = $this->response; } $resp->outputErrors(); jSession::end();</code>
En espérant que cela pourra servir à quelqu'un en attendant le patch.
Merci pour tes réponses.
Olivier
[Opened] Re: générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by zitoun on 08/10/2011 15:02
D'ailleurs pour que la réponse en erreur possède le message qui est envoyé par l'appel à trigger_error($msg, $errcode), il faut aussi ajouter la modification suivante:
--- /lib/jelix/core/response/jResponseJsonrpc.class.php @@ +57,1 @@ <code> if ($e) { $errorCode = $e->getCode(); //On ajoute ici le message personnalisé $errorMessage = $e->getMessage(); } else { $errorCode = -1; }</code>
Cordialement,
Olivier
[Opened] générer une erreur au format jResponseJsonRpc Jelix 1.3
Posted by laurentj on 08/11/2011 01:26
Correction disponible dans la nightly.
Pour ton message d'erreur, ce n'est pas très approprié. Cela peut être "dangereux" de divulguer certains messages d'erreur. J'ai donc amélioré un peu le comportement existant : les erreurs dont le code est > 5000 (erreurs non internes) sont renvoyées telles quels, les autres sont anonymisées, seul le code est disponible.
Je viens de découvrir également que version 2 de JSON-RPC a été spécifiée : http://groups.google.com/group/json-rpc/web/json-rpc-2-0 . Il faudra qu'on adapte l'implémentation actuelle.
- 1