Json Rpc
Jednoduchý RPC server/klient pro Nette využívající json pro přenos dat. Slouží k volání vzdálených metod mezi nette aplikacemi (při menší úpravě lze i využít bez Nette).
| Verze | 0.1 BETA |
|---|---|
| Download | https://github.com/…erver-client |
| Demo | – |
| Forum thread | http://forum.nette.org/…nt-pro-nette |
| Autor | Vít Ledvinka |
| Licence | GPL |
Instalace
Instalace je velice jednoduchá, stačí pouze stáhnout z archivu (viz výše) a rozbalit například do složky „libs“ v Nette.
Možnosti
Část serveru
- možnost navázání událostí (onBeforeCall, onSuccessCall, onExceptionCall)
- možnost nastavení autorizace – metoda setAuthorize přijímá instanci třídy implementující rozhraní IJsonRpcAuthorize – metoda této instance checkAccess je volána před každým vzdáleným voláním metody a v případě neautorizovaného volání vrací false
- přenáší vyjímky ze serveru na stranu klienta – v případě vyhození vyjímky v metodě na straně serveru se přenese tato vyjímka i s typem (pokud existuje) na stranu klienta
- pomocí magických setterů se navěšují metody serveru (viz příklad níže)
- poskytuje seznam dostupných metod
Část klienta
- pomocí magické metody call volá vzdálené metody
- získává seznam dostupných metod serveru i s jejich anotacemi a to přenáší do debugbaru

Příklad použití
Server:
final class JsonServerPresenter extends BasePresenter
{
public function actionDefault()
{
// Získání dat z POST
$post = $this->getRequest()->getPost();
// Inicializace serveru
$server = new \JsonRpc\JsonRpcServer($post);
// Přidání callbacku na událost volané při vzdáleném zavolání metody
$server->onBeforeCall = function($method, $args) { ... };
// Přidání callbacku na událost volané po úspěšném vzdáleném volání metody
$server->onSuccessCall = function($method, $args, $return) { ... };
// Přidání callbacku na událost volaní při vyhození vyjímky vzdálené metody
$server->onExceptionCall = function($method, $args, $exception) { ... };
// Zde můžeme navěsit vlastní callbacky, které bude možné vzdáleně volat
// Jako closury (anonymní funkce)
$server->checkEmail = function($email) { return $email . " - test"; };
// Jako volání metody instance
$server->checkName = array($this, "checkName");
// Jako statická metody předaná řetězcem
$server->webalize = "\Nette\Utils\Strings::webalize";
// Po navěšení všech metod, spustíme server
$output = $server->execute();
// Odešleme data do prohlížeče
$httpResponse = $this->context->httpResponse;
$httpResponse->setContentType('text/plain', 'UTF-8');
$this->sendResponse(new \Nette\Application\Responses\TextResponse($output));
}
/** Zakážeme šablonu a debugbar */
public function renderDefault()
{
\Nette\Diagnostics\Debugger::$bar = false;
$this->terminate();
}
/** Příklad navěšené metody, které vrací vyjímku při předaní hodnoty "test" */
public function checkName($name)
{
if ($name == "test")
throw new \BadMethodCallException("Test vyvolání vyjímky!");
return ($name == "admin") ? true : false;
}
}
Klient:
final class JsonClientPresenter extends BasePresenter
{
public function actionDefault()
{
// Inicializace klienta, předání URL serveru
$client = new \JsonRpc\JsonRpcClient("http://www.example.com/json-server/");
// Vrácení seznamu metod a zaregistrování panelu se seznamem metod
$client->getListOfMethod();
// Volání vzdálených metod
var_dump($client->checkName("admin"));
// Vyvolá vyjímku viz výše \BadMethodCallException
var_dump($client->checkName("test"));
var_dump($client->checkEmail("test@example.com"));
var_dump($client->webalize("testovací řetězec"));
}
}
Plán do budoucna
- přetvoření requestu dle specifikace http://groups.google.com/…1-2-proposal?…
- možnost zpracování fronty požadavků na jeden request
- přidání autorizační / authentizační vrstvy (?)
- předávání hodnot proměnných/konstant
- odstínění od nezbytného využití nette (lite verze bez nette)
- vrstva zabezpečení (https / šifrování / ..)
Historie
0.1 BETA – první verze Json-RPC