JSONRPC in PHP

Nello sviluppo di una webapplication moderna c'è spesso la necessità di effettuare delle chiamate a procedure remote. Se si tratta di una applicazione web scritta in HTML5 & Javascript la tecnologia di più naturale è JSONRPC.  

Vediamo un esempio in PHP; ci sono diverse librerie che implementano questo standard, ma in barba al principio di "non reinventare la ruota"  ho deciso di fare una mia implementazione che trovate qui:

https://github.com/amlet0/jsonrpc4php

Vediamo un esempio di utilizzo molto semplice: implementiamo una calcolatrice con la sola operazione di somma che verrà eseguita sul server, il risultato sarà visualizzato nel browser dell'utente. Ci servono 3 files, il file jsonrpc-server.php che potete scarica da github, un endpoint scritto in PHP che risponde alle richieste remote (server), ed una pagina in html&js che invia le richieste (client).

--- inizio file rpc.php ---

<?php 
require_once 'jsonrpc-server.php';
 
class Calculator {
    public function add($a, $b) {
        return $a+$b;
    }
}
 
$server = new HttpJsonRpcServer();
$server->register(new Calculator(), 'calc');
$server->httpExec(); 
?> 

--- fine file rpc.php ---

grazie a questo codice avremo così creato un oggetto "Calculator" con un metodo "add" che esegue la somma.

--- inizio file index.html ---

<html>
 
<head>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
$(function() {
// rpc call: calc.add(1, 2)
$.post(
'jsonrpc-httpserver-test.php',
JSON.stringify({ jsonrpc: '2.0', method: 'calc.add', params: [1, 2], id: "1" }),
null, 'json'
)
.done(function(data) {
alert(data.result);
});
});
</script>
</head>
 
<body>
</body>
 
</html>

--- fine file index.html ---

Aprendo questo file con un browser verrà visualizzato un popup con il risultato della somma di 1+2. Tale somma però è stata effettuata sul server, non nel browser.

Con questa tecnica potrete implementare veri e proprio webservices da utilizzare nella vostra webapp, ben più complicati di questo esempio "didattico" della calcolatrice (ad esempio potete esporre delle API per la manipolazione di oggetti sul database, per l'autenticazione degli utenti, etc.)