C++ JSON-RPC

Da Andreabont's Wiki.

Questa pagina si basa sulla libreria disponibile qui

Utilizzare la libreria

Installazione del framework

git clone git://github.com/cinemast/libjson-rpc-cpp.git
mkdir -p libjson-rpc-cpp/build
cd libjson-rpc-cpp/build
cmake .. && make
sudo make install   #Not required, but makes it easier to use
sudo ldconfig       #only required for linux

Creazione del file di specifica

Il framework necessita di un file di specifica (in json) che definisca quali funzioni siano chiamabili via RPC.
Questa specifica dele essere condivisa sia dal server che dal client.

[
    {
        "name": "sayHello",
        "params": { 
            "name": "Peter"
        },
        "returns" : "Hello Peter"
    },
    {
        "name" : "notifyServer",
        "params": null
    }
]

NB: Notare il parametro "name", viene passato secondo il metodo by-name, che non è compatibile con il metodo by-position.

Generazione del codice C++ a partire dal file di specifica

E' necessario generare il codice C++ a partire dal file specifica, necessario per il client e per il server per funzionare.

jsonrpcstub <file_specifica> --cpp-server=AbstractStubServer --cpp-client=StubClient

Che genererà le classi:

  • AbstractStubServer per il server. (File generato: abstractstubserver.h)
  • StubClient per il client. (File generato: stubclient.h)

Server

Come si può notare dal nome, il codice generato per il server è una classe astratta, questo perchè vanno implementate le funzioni che poi verranno chiamate.

Codice

#include "abstractstubserver.h"
#include <jsonrpccpp/server/connectors/httpserver.h>

using namespace jsonrpc;
using namespace std;

// Creo classe reale che implementa AbstractStubServer
class MyStubServer : public AbstractStubServer
{
    public:
        MyStubServer(AbstractServerConnector &connector);

        virtual void notifyServer();
        virtual std::string sayHello(const std::string& name);
};

MyStubServer::MyStubServer(AbstractServerConnector &connector) : AbstractStubServer(connector) {}

// Implemento notifyServer
void MyStubServer::notifyServer()
{
    cout << "Server got notified" << endl;
}

// Implemento sayHello
string MyStubServer::sayHello(const string &name)
{
    return "Hello " + name;
}

// MAIN
int main()
{
    HttpServer httpserver(8383); // Porta in ascolto
    MyStubServer s(httpserver);
    s.StartListening();
    getchar();
    s.StopListening();
    return 0;
}

Compilare il server

g++ main.cpp -ljsonrpccpp-server -ljsoncpp -ljsonrpccpp-common -o sampleserver

Client

Codice

#include <iostream>

#include "stubclient.h"
#include <jsonrpccpp/client/connectors/httpclient.h>

using namespace jsonrpc;
using namespace std;

int main()
{
    HttpClient httpclient("http://localhost:8383");
    StubClient c(httpclient);
    try
    {
        cout << c.sayHello("world!") << endl;
        c.notifyServer();
    }
    catch (JsonRpcException e)
    {
        cerr << e.what() << endl;
    }
}

Compilare il client

g++ main.cpp -ljsonrpccpp-client -ljsoncpp -ljsonrpccpp-common -lcurl -o sampleclient